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)