2017-06-06 18 views
0

如何使用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] |> 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)。

相關問題