根据民间传说,我们可以拥有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
的定义?还是从一开始就错了?