我做了一个函数,它的名字是maptree
。下面是我的代码:
datatype 'a tree = LEAF of 'a | NODE of 'a tree * 'a tree;
fun maptree(f, NODE(X, Y)) = NODE(maptree(f, X), maptree(f, Y))
| maptree(f, LEAF(X)) = LEAF(f X);
我期望maptree有这样的类型
('a -> 'a) -> 'a tree -> 'a tree
但编译器推断的类型是
('a -> 'b) * 'a tree -> 'b tree
为什么会发生这种情况?
The 欣德利-米尔纳类型推断算法允许您获得比预期更通用的类型。
当算法尝试推断类型时maptree
,它假设f: 'a -> 'b
(从你正在使用的事实来看f
作为一个函数)。并且没有任何限制的类型f
更远。
例如,如果您定义了maptree
功能如下(我用过f
两次在LEAF
case):
fun maptree(f, NODE(X, Y)) = NODE(maptree(f, X), maptree(f, Y))
| maptree(f, LEAF(X)) = LEAF(f (f X))
那么类型推断机制必须限制f
to 'a -> 'a
(因为我们将函数的输出提供给它的输入)。
修改后的情况下 SML/NJ 的输出:
val maptree = fn : ('a -> 'a) * 'a tree -> 'a tree
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)