我在玩Control.Applicative
,我意识到我不理解Haskell类型系统的所有内容。
这是我在古驰的实验:
λ :t (<*>)
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
λ :t (<*>) (pure 2)
(<*>) (pure 2) :: (Num (a -> b), Applicative f) => f a -> f b
<*>
的第一个参数的类型是f (a -> b)
。
(pure 2)
统一,因为常量2
不是a -> b
类型Num (a -> b)
是什么意思?具有a -> b
类型的函数如何成为Num
的实例?发布于 2014-12-02 11:39:46
<*>
的第一个论点应该是f (a -> b)
。因此,给定(<*>) (pure x)
,如果x
是某种函数,则这是很好的类型。
2
的类型是Num a => a
。换句话说,只要2
是Num
的一个实例,它就可以是任何可能的类型。
因此,在表达式(<*>) (pure 2)
中,如果2
的类型是函数类型,并且该函数类型有一个Num
实例,则这是很好的类型。
当然,您几乎没有理由希望函数有一个Num
实例。但编译器不知道这点。所有的说法是,如果有这样的一个实例,那么表达式将成为良好的类型。
(这与您有时看到的错误类似,编译器希望某些类型同时成为Integral
和Fractional
的实例。对人类来说,这是一个荒谬的组合。对机器来说,它们只是两个普通的阶级.)
https://stackoverflow.com/questions/27247921
复制相似问题