F a = (a -> p) -> q
形式的类型构造函数在a
中是协变的(其中我们假设p
和q
是固定类型,只有a
变化)。所以,F
是一个函子。
假设
F
和 p
是不同的、不相关的固定类型,q
是一个应用函子吗?
我的猜测是
F
不适用(无法实现合法方法zip
或ap
),但我没有证据。我也无法为遵守法律的Applicative
实现F
的方法。不守法实施的一个例子是:
zip :: F a -> F b -> F (a, b)
zip _ _ _ = q0
其中
q0
是q
类型的固定值。 zip
的这种实现忽略了它的所有参数,这会丢失信息并且不可能遵守zip
的恒等法则。
能否证明
F
是适用的,或者无法对zip
实施合法方法ap
或F
?
如果需要,我们可以假设
p
和 q
是幺半群类型(不过我认为这不会有帮助)。
作为比较,如果
p
和 q
是同一类型,我们得到 F a = (a -> p) -> p
,它是一个延续 monad,也是适用的。问题是关于类型 p
和 q
不同且不相关、未知的固定类型时的情况。
如果允许我假设
q
是幺半群,那么
type F p q a = Const q (a -> p)
给你一个应用实例。详细:
newtype F p q a = F q
instance Functor (F p q) where fmap (F q) = F q
instance Monoid q => Applicative (F p q) where
pure _ = F mempty
F x <*> F y = F (x <> y)