Sml 1例出现多模式

Sml 1例出现多模式,sml,smlnj,Sml,Smlnj,在SML中,是否可以在一个case语句中包含多个模式 例如,我有4个用字符串表示的算术运算符,“+”、“-”、“*”、“/”,我想打印“加减”,如果它是“*”或“/”,则它是“加减” TL;DR:是否有地方可以简化以下内容以减少使用案例 case str of "+" => print("PLUS MINUS") | "-" => print("PLUS MINUS") | "*" => print("MULT DIV") | "/" => print("MU

在SML中,是否可以在一个case语句中包含多个模式

例如,我有4个用字符串表示的算术运算符,
“+”、“-”、“*”、“/”
,我想打印
“加减”
,如果它是
“*”或“/”
,则它是
“加减”

TL;DR:是否有地方可以简化以下内容以减少使用案例

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

在标准ML中,否。在其他ML方言中,如OCaml,是。在某些情况下,您可以考虑将分割模式匹配分为单独的实例/函数,或者跳过模式匹配,以支持较短的捕获所有表达式,例如

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

假设您已经用标签标记了您的问题,那么是的,SML/NJ支持这种模式。他们称之为,它看起来是这样的:

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

MLton的主分支也支持它,作为它们的一部分,但是您必须自己编译MLton

val str = "+"

val _ =
  case str of
    "+" | "-" => print "PLUS MINUS"
  | "*" | "/" => print "MULT DIV"
请注意,MLton不需要论文。现在使用此命令编译它(与SML/NJ不同,您必须在MLton中显式启用此功能):


扩展Ionuț的示例,您甚至可以将数据类型与其中的其他类型一起使用,但它们的类型(和标识符分配)必须匹配:

datatype mytype = COST as int | QUANTITY as int | PERSON as string | PET as string;

case item of
  (COST n|QUANTITY n) => print Int.toString n
  |(PERSON name|PET name) => print name
如果类型或名称不匹配,将被拒绝:

case item of
  (COST n|PERSON n) => (* fails because COST is int and PERSON is string *)
  (COST n|QUANTITY q) => (* fails because the identifiers are different *)
这些模式也适用于函数定义:

fun myfun (COST n|QUANTITY n) = print Int.toString n
   |myfun (PERSON name|PET name) = print name
;

使用该模式后,如果要在案例中使用角色,如何访问该角色?如果您有模式x::xs,您可以说“第一个是”^x。你能说“第一个是“^”(“+|“-”)吗?@retrovius你可以用as模式绑定它:
char-as(“+”|“-”)=>print(“char-was:“^char^”\n”)
fun myfun (COST n|QUANTITY n) = print Int.toString n
   |myfun (PERSON name|PET name) = print name
;