那不是您的实际代码——该代码不会产生这些消息。
您的实际代码看起来更像这样:
fun inclist ([], 0) = []
| inclist (l, inc) = map (fn x => x + inc) l;
inclist [1,2,3,4,5] 1;
具有相同形状的定义子句。
您已经定义了一个函数,它接受一对anint list和 anint并返回一个int list。
正如错误消息所说:int list * int -> int list。
然后你尝试将此函数应用于不是这样一对的东西。
inclist [1,2,3,4,5] 1与(inclist [1,2,3,4,5]) 1- 它首先应用于inclist,[1,2,3,4,5]然后将结果 - 必须是函数 - 应用于1。
您的第一条消息是指inclist [1,2,3,4,5],并说这[1,2,3,4,5]不是int list * int,inclist需要。
第二条消息是指您申请inclist [1,2,3,4,5], 1wheninclist [1,2,3,4,5]不是函数。
(根据前面的消息,当它有类型错误时,polyml 声称它inclist [1,2,3,4,5]是一个有点奇怪int list。一种可能的解释是,polyml 不会费心检查参数的类型,而是“inclist应用于任何参数是int list“。)
解决方案是像函数期望的那样传递一对:
inclist ([1,2,3,4,5], 1)
或以“咖喱”方式定义函数:
fun inclist [] 0 = []
| inclist l inc = map (fn x => x + inc) l;
inclist [1,2,3,4,5] 1;
另一方面,第一个特殊情况是不必要的。
如果您担心效率低下,那么使用特殊情况0比[](避免在巨大列表中添加零可能是有益的;仅使用空列表避免它是没有意义的)更有意义。
fun inclist (l, 0) = l
| inclist (l, inc) = map (fn x => x + inc) l;
但这也可以完成这项工作:
fun inclist (l, inc) = map (fn x => x + inc) l;