众所周知的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 - 替代类(class)表述的适用法律,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45267953/