0

如何用switchoperator 而不是 large实现这个逻辑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 {";

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

4

1 回答 1

1

首先,代替".".[0] |> Char.code,尝试'.' |> 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 的代码。本机编译也会发生同样的事情。

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

于 2017-06-06T22:07:05.630 回答