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

时间:2017-06-06 21:49:15

标签: ocaml reason

如何使用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 {";

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

1 个答案:

答案 0 :(得分: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代码here。本机编译也会发生同样的事情。

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