1

任何人都可以向我解释如何确定以下函数的类型,折叠,如下定义?

fun fold func [] base = base
|   fold func (x::xs) base = fold func xs (func x base);

我的答案是'c->'a list->'b->'b,但我看到在将代码插入我的SML程序后,类型实际上应该是('a->'b->'b) ->'a 列表->'b->'b.

我了解 'a list->'b->'b 的来源,但第一部分让我感到困惑。是不是因为 func 接受两个参数,一个 'a 和一个 'b,并返回 base 的类型,即 'b?

任何帮助将不胜感激。

4

1 回答 1

1

是不是因为 func 接受两个参数,一个 'a 和一个 'b,并返回 base 的类型,即 'b?

对,就是这样。

如果第一部分'c和你最初假设的一样,那意味着第一个参数fold可以是任何值——int例如。显然,将 an int(或任何其他不是函数的东西)作为第一个参数传递给 是不合法的func,因此第一个参数需要有一个类型,告诉类型系统只允许该参数使用函数。

事实上,它不应该只允许任何函数,而应该只允许适当类型的函数。并且适当的类型func'a -> 'b -> 'b出于您上面所述的原因。

于 2012-11-06T13:35:01.527 回答