`F a = (a -> p) -> q` 是一个应用函子吗?

问题描述 投票:0回答:1

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
不同且不相关、未知的固定类型时的情况。

haskell types functional-programming
1个回答
0
投票

如果允许我假设

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)
© www.soinside.com 2019 - 2024. All rights reserved.