Haskell 替代类公式的应用定律

Haskell 替代类公式的应用定律,haskell,applicative,Haskell,Applicative,Applicative(参见,例如,Typeclassopedia)的一个众所周知的替代公式是 这导致了比从Applicative中得到的更像典型的身份和关联性法则的法则,但只有当你通过对重关联同构进行工作时。几周前考虑到这一点,我提出了另外两种避免这个问题的配方 class Functor f => Fapplicative f where funit :: f (a -> a) fcomp :: f (b -> c) -> f (a -> b) ->

Applicative
(参见,例如,Typeclassopedia)的一个众所周知的替代公式是

这导致了比从
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)
使用
Applicative
faapplicative
使用
capapplicative
Applicative
使用
faapplicative
很容易实现
capapplicative
,因此它们都具有同等的功能

同一性和结合性定律是显而易见的。但是
Monoidal
需要一个自然法则,而且这些法则也必须存在。我该如何表述它们?另外:
capapplicative
似乎暗示了一种直接的概括:

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)

该类别被调用。如果这证明足够(我会在有机会的时候尝试一下),它表明
Functor
Appish
的约束可能会被削弱,同时仍然得到一些“合理的”东西。这个定律可以用一个
dimap
来表示,而不是
fmap
,比如
(c~>d)->(a~>b)->f(b~>c)->f(a~>d)
。这个讨论似乎是相关的:
fcomp (fmap (post .) u) (fmap (. pre) v) = fmap (\f -> post . f . pre) (fcomp u v)