【发布时间】:2019-12-16 14:14:13
【问题描述】:
我做了这个函数:
compose [] = id
compose (x:xs) = x . (compose xs)
当我询问类型时:
:t compose
compose :: [b -> b] -> b -> b
如果 a 按字母顺序排在第一位,为什么它会给出 compose :: [b -> b] -> b -> b 而不是 compose :: [a -> a] -> a -> a?
说到这里,我再补充一个例子:
badImplementationOfCompose [] = id
badImplementationOfCompose (x:xs) = (badImplementationOfCompose xs)
:t badImplementationOfCompose
badImplementationOfCompose :: [a1] -> a2 -> a2
它可能会给出一些提示......
【问题讨论】:
-
GHCi 尝试使用出现在您使用的函数类型中的类型变量的名称。由于推理算法相当复杂,因此很难猜测哪个名字幸存下来。在这里,
b似乎来自.的类型,或者至少这是我的猜测。执行顺序统一显然选择了那个而不是其他名称。 -
从这两个目标中,the older one 简洁地解释了它的要点,而the newer one 讨论了一些边缘情况。
-
@duplode 感谢一如既往的帮助
标签: list haskell types ghc type-inference