2016-04-01 11 views
3

SMLでは、1つのcase文で複数のパターンを使用できますか?それは"*" or "/"ある場合複数のパターンが1件の場合

例えば、I 4つの算術演算子は、文字列で表現"+", "-", "*", "/"、私はそれの"PLUS MINUS"を印刷したいたが"+" or "-""MULT DIV"あります。

TL; DR:どこかで、以下のようなケースを少なくすることができますか?

case str of 
    "+" => print("PLUS MINUS") 
| "-" => print("PLUS MINUS") 
| "*" => print("MULT DIV") 
| "/" => print("MULT DIV") 

答えて

6

は、[はい、SML/NJは、パターンのこの種をサポートしています。彼らはor-patternsそれを呼び出すと、それは次のようになります。

case str of 
    ("+" | "-") => print "PLUS MINUS" 
| ("*" | "/") => print "MULT DIV" 

は括弧に注意してください。

MLtonのmasterブランチも、Successor ML effortの一部としてそれをサポートしていますが、MLtonを自分でコンパイルする必要があります。

val str = "+" 

val _ = 
    case str of 
    "+" | "-" => print "PLUS MINUS" 
    | "*" | "/" => print "MULT DIV" 

MLtonには、パセンテンスは必要ありません。今度はこのコマンドを使ってコンパイルしてください(SML/NJと違って、この機能をMLtonで明示的に有効にする必要があります):

mlton -default-ann 'allowOrPats true' or-patterns.sml 
2

標準MLでは、 OCamlのようなMLの他の方言では、そうです。いくつかのケースでは、パターンマッチングを別々のケース/関数に分割することを検討したり、パターンマッチングをスキップしてより短いキャッチオール式にすることができます。あなたはタグで質問をタグ付けしましたことを考えると

if str = "+" orelse str = "-" then "PLUS MINUS" else 
if str = "*" orelse str = "/" then "MULT DIV" else ...