如何使用 switch 运算符以及迭代字符串和检测符号的最佳方法

How to use switch operator and best way to iterate string and detect symbols

如何使用 switch 运算符而不是大 if/else 来实现此逻辑?

   type token =
  | DOT
  | OPEN_BRACKET
  | SYMBOL;

let dot_code = ".".[0] |> Char.code;
let open_bracket_code = "{".[0] |> Char.code;

let char_to_token symbol :token => {
  let code = Char.code symbol;
  let c =
    if (code === dot_code) {
      DOT
    } else if (code === open_bracket_code) {
      OPEN_BRACKET
    } else {
      SYMBOL
    };
  c
};

String.iter
  (
    fun symbol => {
      let c = char_to_token symbol;
      switch c {
      | DOT => print_string " DOT "
      | OPEN_BRACKET => print_string " OPEN_BRACKET "
      | SYMBOL => print_char symbol
      }
    }
  )
  "a.s {";

或者迭代字符串并检测 .{ 等符号的最佳方法是什么?

首先,尝试 '.' |> Char.code 而不是 ".".[0] |> Char.code。 Reason/OCaml 有字符文字。在这种情况下,由于它是单个管道,因此建议使用 Char.code '.'

其次,我个人也会在 char_to_token 中使用一个开关:

let char_to_token symbol :token =>
  switch symbol {
  | '.' => DOT
  | '{' => OPEN_BRACKET
  | _ => SYMBOL
  };

这首先消除了对上述 let dot_code = ... 的需求。正如您可能已经猜到的那样,使用 switch 的好处是效率更高。请参阅编译为 js 的代码 here。本机编译也会发生同样的事情。

其他看起来不错!顺便说一句,既然你告诉我(不和谐)你刚刚开始 Reason,我会说这很简单并保持这种方式!当你变得更熟练时,我感觉你可能需要一个真正的解析器或者试试 GADT (http://mads-hartmann.com/ocaml/2015/01/05/gadt-ocaml.html).