Applicative
的著名替代公式(参见,例如,Typeclassopedia)是
class Functor f => Monoidal f where
unit :: f ()
pair :: f a -> f b -> f (a, b)
这导致法律看起来更像典型的身份和关联性法律,而不是您从
Applicative
获得的法律。 ,但仅当您通过对重关联同构工作时。几周前考虑到这一点,我想出了另外两个避免这个问题的配方。class Functor f => Fapplicative f where
funit :: f (a -> a)
fcomp :: f (b -> c) -> f (a -> b) -> f (a -> c)
class Functor f => Capplicative f where
cunit :: Category (~>) => f (a ~> a)
ccomp :: Category (~>) => f (b ~> c) -> f (a ~> b) -> f (a ~> c)
很容易实现
Capplicative
使用 Applicative
, Fapplicative
使用 Capplicative
, 和 Applicative
使用 Fapplicative
,所以这些都具有等效的功率。恒等律和结合律是完全显而易见的。但是
Monoidal
需要一个自然法则,这些也必须。我该如何制定它们?另外:Capplicative
似乎建议立即进行概括:class (Category (~>), Functor f) => Appish (~>) f where
unit1 :: f (a ~> a)
comp1 :: f (b ~> c) -> f (a ~> b) -> f (a ~> c)
我有点好奇这(或类似的东西)是否对某事有好处。
最佳答案
这是一个非常巧妙的想法!
我认为 fcomp
的自由定理是
fcomp (fmap (post .) u) (fmap (. pre) v) = fmap (\f -> post . f . pre) (fcomp u v)
关于haskell - 替代类公式的适用法律,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45267953/