z1n*_*Y5A 4 haskell type-systems applicative
我正在玩,Control.Applicative我意识到我不了解Haskell类型系统的一切.
这是我在Ghci的实验:
? :t (<*>)
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
? :t (<*>) (pure 2)
(<*>) (pure 2) :: (Num (a -> b), Applicative f) => f a -> f b
Run Code Online (Sandbox Code Playgroud)
第一个参数的类型<*>是f (a -> b).
(pure 2)因为常量2不是类型a -> b?Num (a -> b)意思?具有a -> b类型的函数如何成为Num?的实例?<*>应该是第一个参数f (a -> b).所以(<*>) (pure x),这是一种很好的类型,只要它x是某种功能.
类型2是Num a => a.换句话说,2可以是任何可能的类型,只要它是一个实例Num.
所以在你的表达式中(<*>) (pure 2),只要类型2是函数类型,并且该函数类型具有Num实例,这是良好类型的.
当然,几乎没有理由要求函数拥有Num实例.但是编译器不知道这一点.所有它的说法是,如果有这样的实例,那么表达式将变得很好.
(这类似于在编译器想要一些类型为实例的错误,你有时会看到Integral并Fractional同时为了人类,这是荒谬的组合,为机器,他们只是两个普通班......)