任何人都可以向我解释如何找出以下函数的类型,折叠,如下所定义?
fun fold func [] base = base
| fold func (x::xs) base = fold func xs (func x base);
我的答案是'c->'一个列表 - >'b->'b,但我看到在将代码插入我的SML程序后该类型实际上应该是('a-> 'b->'b) - >'a list->'b->'b。
我理解'a list->'b->'b来自哪里,但第一部分令我困惑。是因为func接受两个参数,一个'a和a'b,并返回base的类型,即'b?
非常感谢任何帮助。
答案 0 :(得分:1)
是因为func接受两个参数,一个'a和a'b,并返回base的类型,即'b?
是的,确实。
如果第一部分只是你第一次假设'c
,那就意味着fold
的第一个参数可以是任何值 - 例如int
。显然,传递int
(或其他任何不是函数的函数)作为func
的第一个参数是不合法的,所以第一个参数需要有一个告诉类型的类型系统只允许这个参数的函数。
实际上它不应该仅允许任何函数,而只允许适当类型的函数。由于上述原因,func
的相应类型为'a -> 'b -> 'b
。