List ghci如何为类型变量选择名称?
我做了这个功能:List ghci如何为类型变量选择名称?,list,haskell,types,ghc,type-inference,List,Haskell,Types,Ghc,Type Inference,我做了这个功能: compose [] = id compose (x:xs) = x . (compose xs) 当我问起类型时: :t compose compose :: [b -> b] -> b -> b 为什么它给出compose::[b->b]->b->b而不是compose:[a->a]->a->a,如果a按字母顺序排在第一位 话虽如此,我将添加另一个示例: badImplementationOfCompose [] = id badIm
compose [] = id
compose (x:xs) = x . (compose xs)
当我问起类型时:
:t compose
compose :: [b -> b] -> b -> b
为什么它给出compose::[b->b]->b->b
而不是compose:[a->a]->a->a
,如果a按字母顺序排在第一位
话虽如此,我将添加另一个示例:
badImplementationOfCompose [] = id
badImplementationOfCompose (x:xs) = (badImplementationOfCompose xs)
:t badImplementationOfCompose
badImplementationOfCompose :: [a1] -> a2 -> a2
它可能会给出一些提示…我想这与
的类型有关
(.) :: (b -> c) -> (a -> b) -> a -> c
在推断类型时,它只是从这里开始替换
a
必须等于b
,b
必须等于c
。因此,简而言之,我的猜测是,如果可能的话,它试图使类型变量命名与所用子函数中的类型变量名称保持一致。我的猜测:
GHCi以泛型类型开始。如果未给出任何函数,我将讨论第二个示例:
badImplementationOfCompose [] = id
badImplementationOfCompose (x:xs) = (badImplementationOfCompose xs)
它的类型是id
beeinga->a
,因此如果需要另一个类型变量,它将开始按一个变量添加
badImplementationOfCompose :: [a1] -> a2 -> a2
我想,也许@chi是绝对正确的,名字来自函数,所以我用我自己的id
:
id2 :: c -> c
id2 x = x
badImplementationOfCompose [] = id2
badImplementationOfCompose (x:xs) = (badImplementationOfCompose xs)
类型如预期:
:t badImplementationOfCompose
badImplementationOfCompose :: [a] -> c -> c
第一个类型变量是GHCi创建的
a
,而c->c
取自id2
GHCi试图使用您使用的函数类型中出现的类型变量的名称。由于推理算法相当复杂,很难猜出哪个名字幸存下来。在这里,似乎b
来自
的类型,或者至少这是我的猜测。“执行顺序统一”显然选择了该名称,而不是其他名称。从这两个目标中,以简洁的方式解释了其要点,同时讨论了一些边缘情况。@duplode感谢您一直以来的帮助