问题描述
以下内容出现错误:
(* 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
,所以请不要忘记SOME
周围的"Tom"
。这是更正的代码:
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)
^ "!";
,
该功能偶然与two-fer exercise of Exercism.io相对应。由于未显示我最喜欢的两个变体,因此我建议直接在greeting
的参数中建议使用模式匹配或使用库函数:
fun greeting NONE = "Hello there,you!"
| greeting (SOME name) = "Hello there," ^ name ^ "!"
fun greeting name =
"Hello there," ^ Option.getOpt (name,"you") ^ "!"
之所以喜欢第一个,是因为它与大小写一样使用大小写匹配,但是语法较少。之所以喜欢第二个,是因为它避免了重复字符串的相同部分,并且使用库函数来做到这一点,因此您可以期望读者之前已经看到过这一点。