具有选项的SML函数中的类型不匹配



以下出现错误:

(* Greetings, Earthlings! *)
fun greeting (some_name : string option) =
"Hello there, " ^
(if isSome some_name
then valOf some_name
else "you")
^ "!"

greeting("Tom")

错误为:

> $sml < main.sml
Standard ML of New Jersey v110.78 [built: Thu Aug 31 03:45:42 2017]
- = stdIn:3.5-9.16 Error: operator is not a function [tycon mismatch]
operator: string
in expression:
"!" greeting

我想不出哪里有打字不匹配的地方。

不要忘记"!"后面的分号。SML在这里假设greeting("Tom")是函数的一部分。因此它将"!" greeting解释为一个函数调用。

另外,您的函数参数是string option,所以不要忘记"Tom"周围的SOME。这是更正后的代码:

fun greeting (some_name : string option) =
"Hello there, " ^
(if isSome some_name
then valOf some_name
else "you")
^ "!";

print (greeting (SOME "Tom") ^ "n");
print (greeting NONE ^ "n");

就我个人而言,我更喜欢在这种情况下使用模式匹配,因为它在我看来增强了可读性:

fun greeting (some_name : string option) =
"Hello there, " ^
(case some_name
of NONE => "you"
| SOME name => name)
^ "!";

这个函数恰好对应于Exercism.io的两个fer练习。由于我最喜欢的两个变体尚未显示,我建议直接在greeting的参数中进行模式匹配,或者使用库函数:

fun greeting NONE = "Hello there, you!"
| greeting (SOME name) = "Hello there, " ^ name ^ "!"
fun greeting name =
"Hello there, " ^ Option.getOpt (name, "you") ^ "!"

喜欢第一个的原因是它使用了与的大小写一样的大小写匹配,但语法较少。喜欢第二个的原因是它避免了重复字符串中相同的部分,并且使用库函数这样做,所以你可以期待读者以前看到过。

最新更新