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,所以请不要忘记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") ^ "!"

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...