2016-04-01 121 views
3

在SML中,您是否可以在一种情况下使用多种模式?1种情况下的多种模式

例如,我有4个算术运算符表示字符串,"+", "-", "*", "/",我想打印"PLUS MINUS"它是"+" or "-""MULT DIV"如果"*" or "/"

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的主分支也支持它,作为它们的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中,在ML的其他方言中,如OCaml,是的。在某些情况下,您可能会考虑将匹配的模式分解为单独的案例/函数,或者跳过模式匹配以支持较短的全部捕获表达式。

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