替代类配方的适用法律

时间:2017-07-23 17:27:24

标签: haskell applicative

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)

使用CapplicativeApplicative使用FapplicativeCapplicative使用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)

我有点好奇这个(或类似的东西)是否对某事有好处。

1 个答案:

答案 0 :(得分:1)

这是一个非常巧妙的想法!

我认为fcomp的自由定理是

fcomp (fmap (post .) u) (fmap (. pre) v) = fmap (\f -> post . f . pre) (fcomp u v)