当我检查ghci时,我发现了这种现象;
Prelude> :t pure []
pure [] :: Applicative f => f [a]
Prelude> :t pure [] 3
pure [] 3 :: [a]
Prelude> pure [] 3
[]
我不确定为什么会这样,为什么pure [] 3
是[a]
的类型?
最后一个表达式会发生什么?
答案 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
,因此返回类型为[]
,其中列表可以包含任何类型的项目。