为什么< *> Const实例接受两个非功能值?

时间:2017-05-30 09:03:07

标签: haskell applicative

UWP

我想这种行为必须与(<*>) :: Applicative f => f (a -> b) -> f a -> f b Const :: a -> Const a b Monoid m => Applicative (Const * m) Const "a" <*> Const "b" -- yields Const "ab" Const a <*> Const a = Const a <> Const a 是二进制类型构造函数的事实有关,其中Const从未被触及(幻像类型)。但我再次理解b,因为Const * m(和a分别)似乎在这种情况下被丢弃了。

1 个答案:

答案 0 :(得分:4)

首先如果MonoidConst m个实例,那么Applicative会有Const m个实例。但是<*>仍然是一个类型构造函数,因此Applicative (Const m)的类型 (<*>) :: Const m (a -> b) -> Const m a -> Const m b 读取

Const "a"

现在,请将其应用于Const "b"Const "a"

Const String b的类型为m。所以这里的类型变量String假定类型为b。该值仍然是Const "a" <*> Const "b"的多态,因为它不包含该类型的具体值,所以类型仍然可以是任何类型。

在表达式Const "a"中,多态值Const String (a->b)将被强制为Const "b"类型,并且多态值Const String a将被强制为{{1}类型}}

因此左侧确实存在一个带有函数类型的类型,只是具体值不包含函数,类似Nothing类型的值Maybe (Int -> Int)

PS:我不知道*来自Monoid m => Applicative (Const * m)的位置。如果我输入

    :info Const

在ghci中,我得到了行

    instance Monoid m => Applicative (Const m)