问题描述
按照标题,尝试从以下函数返回字符串列表:
fun f (typ : 'Z list option ) : 'Z list =
case typ of
SOME x::xs' => x::xs'
来自终端的反馈如下:
hw2_1.sml:62.28-62.34错误:运算符和操作数不一致[循环度] 运算符域:'Z *'Z列表 操作数:'Z *'Z选项列表 表达: x :: xs'
hw2_1.sml:61.5-62.34错误:案例对象和规则不一致[tycon不匹配] 规则域:'Z选项列表 对象:'Z列表选项 表达: (案例类型 of ::(SOME x,xs')=> x :: xs')
这是在告诉我操作符域和操作数不一致……这是否意味着 Z'列表选项不会映射到某些x :: xs'在表示类型方面是否强?我显然不是在考虑这种正确的方法……不胜感激。
解决方法
您不需要显式注释类型。您也可以只写:
fun f typ =
case typ of
NONE => ...
| SOME (x::xs) => ...
或者您可以直接在功能中嵌入模式匹配:
fun f NONE = ...
| f (SOME (x::xs)) = ...
正如quoify所指出的那样,您遇到的问题与括号有关。
但是我想指出的是,通过使类型隐式可以使程序更易于阅读。
反正他们将是inferred。