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
分别)似乎在这种情况下被丢弃了。
答案 0 :(得分:4)
首先如果Monoid
有Const 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)