2017-06-06 11 views
0

if/elseではなくswitch演算子でこのロジックを実装する方法は?スイッチ演算子を使用し、文字列を検出してシンボルを検出する最適な方法

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] |> Char.codeの代わりに、'.' |> Char.codeを試してください。理由/ OCamlに文字リテラルがあります。この場合、1本のパイプなのでChar.code '.'が推奨されます。

第二に、私は個人的にはあまりにもchar_to_tokenにスイッチを使用すると思います:最初の場所で上記let dot_code = ...を不要にする

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

を。あなたが推測したようにswitchを使用する利点は、それがより効率的であるということです。コンパイルされたjsコードhereを参照してください。ネイティブコンパイルでも同じことが起こります。

残りはよく見えます!あなたがReasonを始めたばかりのことを(不和で)教えてくれて以来、私はこれがかなりシンプルで、このようにしていると言いたいと思います!あなたがより堪能になると、私はあなたが実際のパーサーをここに望むかもしれない、またはGADT(http://mads-hartmann.com/ocaml/2015/01/05/gadt-ocaml.html)を試してみると思います。

関連する問題