为什么我的 ML 函数推断的类型与我预期的不同?

2023-12-01

我做了一个函数,它的名字是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(使用前将#替换为@)

为什么我的 ML 函数推断的类型与我预期的不同? 的相关文章

随机推荐