以下出现错误:
(* 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") ^ "!"
喜欢第一个的原因是它使用了与的大小写一样的大小写匹配,但语法较少。喜欢第二个的原因是它避免了重复字符串中相同的部分,并且使用库函数这样做,所以你可以期待读者以前看到过。