Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List ghci如何为类型变量选择名称?_List_Haskell_Types_Ghc_Type Inference - Fatal编程技术网

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
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

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

GHCi试图使用您使用的函数类型中出现的类型变量的名称。由于推理算法相当复杂,很难猜出哪个名字幸存下来。在这里,似乎
b
来自
的类型,或者至少这是我的猜测。“执行顺序统一”显然选择了该名称,而不是其他名称。从这两个目标中,以简洁的方式解释了其要点,同时讨论了一些边缘情况。@duplode感谢您一直以来的帮助