运行我的函数时出现类型冲突错误,我无法找出原因

时间:2015-11-10 02:00:04

标签: sml ml

功能"总计"应该取一个元组列表并返回每个元组中整数之和的列表。例如,总[[15,15,15],(14,15,15),(13,12,14)]返回[45,42,39]。

    fun help (i1,i2,i3) = i1+i2+i3
    fun total stuff = map help stuff
    total [(15, 15, 15), (14, 13, 15), (13, 12, 14)] 

错误是:

    ! fun total stuff = map help stuff
    !                   ^^^^^^^^^^^^^^
    ! Type clash: expression of type
    !   'a list
    ! cannot have type
    !   'b -> 'c

1 个答案:

答案 0 :(得分:1)

如果我尝试将代码直接粘贴到SML / NJ的REPL中,我会得到一个类似于但与您获得的错误不同的错误(您似乎正在使用另一个ML实现)。问题似乎是REPL无法确定total的定义何处结束,将下一行解释为定义的一部分。一个简单的解决方法是在粘贴到REPL之前将分号放在行的末尾,以便SML可以找出

val help = fn : int * int * int -> int
val total = fn : (int * int * int) list -> int list
val it = [45,42,39] : int list

或者,您可以用

之类的内容替换最后一行
val test = total [(15, 15, 15), (14, 13, 15), (13, 12, 14)];

我只是在这里猜测 - 但似乎你可能正在使用剪切和粘贴将定义从文本文件传输到REPL。如果是这样,那么问题表明这可能是不可靠的。我遇到的工作流程是创建一个文本文件(如果你在Windows中我推荐textpad,因为它有可靠的SML语法高亮显示)然后,在文件的顶部,包括评论行,如

(*use "C:/programs/experiments.sml";*)

(或您选择调用文件的任何内容)然后,在保存后,只需将注释中的文本粘贴到REPL中