haskell - 替代类公式的适用法律

标签 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)

很容易实现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 - 替代类公式的适用法律,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45267953/

相关文章:

f# - 为什么我要使用即将到来的 let! ... 和!句法?

scala - 如何将值元组与函数元组结合起来?

parsing - 使用替代方案的纯应用解析器

haskell - Haskell中整数的非整数居民

haskell - 如何抽象一个常见的 Haskell 递归应用仿函数模式

list - Haskell列表理解编译错误

Haskell:a -> a 类型函数的示例,除了标识

haskell - 如何将可选标志解析为 Maybe 值?

haskell - mapA 用于可能阻塞的流处理器(异步电路)

haskell - 将元素映射到 Haskell 中的函数列表