ghci 如何为类型变量选择名称?

How does ghci choose names for type variables?

我做了这个功能:

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

它可能会给出一些提示...

我猜这与 . 的类型有关,即

(.) :: (b -> c) -> (a -> b) -> a -> c

它只是在推断类型时从那里开始替换。

a 必须等于 bb 必须等于 c。所以简而言之,我的猜测是,如果可能的话,它会尽量使类型变量命名与使用的子函数中的类型变量名称保持一致。

我的猜测:

如果给出 none 函数,GHCi 以泛型开始,我说的是我的第二个例子:

badImplementationOfCompose []     = id
badImplementationOfCompose (x:xs) =  (badImplementationOfCompose xs)

它的类型是 id beeing a -> 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

第一个类型变量a由GHCi创建,c -> c取自id2