为什么(纯[] 3)的类型是“ [a]”?

时间:2019-08-21 13:54:53

标签: haskell

当我检查ghci时,我发现了这种现象;

Prelude> :t pure []
pure [] :: Applicative f => f [a]

Prelude> :t pure [] 3
pure [] 3 :: [a]
Prelude> pure [] 3
[]

我不确定为什么会这样,为什么pure [] 3[a]的类型? 最后一个表达式会发生什么?

1 个答案:

答案 0 :(得分:9)

简短答案:此处使用(->) b作为f

您首次派生时,pure []的类型为pure [] :: Applicative f => f [a]。现在,您将其称为函数。因此,这意味着Haskell用f ~ Num b => (->) b的类型b来推断3。我们在这里很幸运,因为(->) b确实是Applicative, it is defined as [src]的一个实例:

instance Applicative ((->) a) where
    pure = const
    (<*>) f g x = f x (g x)
    liftA2 q f g x = q (f x) (g x)

因此,这里的pure被解释为const :: a -> b -> a。因此,我们写了:

   pure [] 3
-> const [] 3
-> (\_ -> []) 3
-> []

const因此在这里忽略了3,因此返回类型为[],其中列表可以包含任何类型的项目。