那不是您的实际代码——该代码不会产生这些消息。
您的实际代码看起来更像这样:
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]
, 1
wheninclist [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;