众所周知的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/

10-15 21:01