我可以反转适用性吗?

时间:2019-10-19 15:03:56

标签: haskell applicative category-theory

到此。

根据民间传说,我们可以拥有monoidal functor in Haskell

例如,我可以提供以下定义:

class Functor f => Monoidal f where

    coherence :: (f a, f b) -> f (a, b)

通过Monoidal实例可以从Applciative衍生Bitraversable 元组:

instance (Functor f, Applicative f) => Monoidal f where

    coherence :: Applicative f => (f a, f b) -> f (a, b)
    coherence = bisequence

我还可以像这样恢复Applicative的定义方法: (尽管我不确定法律是否正确。)

ap :: Monoidal f => f (a -> b) -> f a -> f b
ap f = (fmap . uncurry) ($) . coherence . (f,)

我可以通过coherence定义其他功能,例如:

curryA :: Monoidal f => (f (a, b) -> f c) -> f a -> f b -> f c
curryA f = (fmap . fmap) (f . coherence) (,)

然后回来。

我们可以撤消这些操作吗?

class DeMonoidal f where

    decoherence :: f (a, b) -> (f a, f b)

在这方面,一些应用函子具有明显的逆函数,例如:

instance DeMonoidal Stream where

    decoherence = Stream.unzip

所以,现在我想拥有与Monoidal相同的美好事物,但反之 周围:

deap :: (f b -> f a) -> f (b -> a)
deap = ?

uncurryA :: DeMonoidal f => (f a -> f b -> f c) -> f (a, b) -> f c
uncurryA = ?

我想出了uncurryA的一个可能定义:

contramap :: (a -> b) -> (b -> c) -> (a -> c)
contramap f g = (g . f)

uncurryA :: DeMonoidal f => (f a -> f b -> f c) -> f (a, b) -> f c
uncurryA f = (contramap decoherence . uncurry) f

-但是它看起来与我上面提供的ap的定义不太相似,因此我还是很怀疑。

有了deap,我根本没有运气。原因之一是功能应用程序无法 通常是相反的。

???

如何进行此询问?是否有deap的定义?还是从一开始就错了?

0 个答案:

没有答案