haskell - Haskell Monad 法则如何从 Monoid 法则推导出来?

标签 haskell monads category-theory monoids

内仿函数类别中幺半群的定律是:

monoid laws

Haskell monad 法则是:

左恒等式:return a >>= k = k a

正确的身份:m >>= return = m

结合性:m >>= (\x -> k x >>= h) = (m >>= k) >>= h

我假设后者是从前者派生出来的,但这是怎么回事呢?图表基本上说

join (join x) = join (fmap join x)
join (return x) = x
join (fmap return x) = x

这些如何等同于 Haskell monad 法则?

最佳答案

要从 join-monad 法则中显示 >>=-monad 法则,需要在中定义 x >>= y乘法 (join)、单位 (return) 和函数性 (fmap),因此我们需要让,根据定义,

(x >>= y) = join (fmap y x)

左恒等式

则左恒等式变为

return a >>= k = k a

根据>>=的定义,相当于

join (fmap k (return a)) = k a

现在,return 是一个自然变换 I -> T(其中 I 是恒等仿函数),所以 fmap_T k .返回=返回。 fmap_I k = 返回。 k。我们将法律简化为:

join (return (k a)) = k a

这遵循 join 法则。

权利同一律

权利同一律

m >>= return = m

根据 >>= 的定义减少到:

join (fmap return m) = m

这正是 join 法则之一。

结合律留给你来证明。它应该遵循使用相同的工具(join 法则、自然性、仿函数性)。

关于haskell - Haskell Monad 法则如何从 Monoid 法则推导出来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69668056/

相关文章:

haskell - 什么是单子(monad)类别的仿函数?

haskell - runST 与 unsafePerformIO 的实际意义

haskell - 位不是从Num派生的吗?

performance - 编译器优化的函数式代码比命令式代码执行得更好的示例

haskell - 无法为此类型编写 Show 实例

function - 函数的类型类实例

haskell - 范畴论基础

Haskell - 使用递归方案的泛型多态代数数据类型的仿函数实例

c++ - 为什么具有无用的隔离 `static` 的函数被认为是不纯的?

docker - 使用 docker : true 时获取堆栈以获取 GHCJS 内置 docker 图像