如何使用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 {";
或者,迭代字符串并检测.
和{
等符号的最佳方法是什么?
答案 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)。