gpt4 book ai didi

haskell - 用join而不是bind表示的Monad法则?

转载 作者:行者123 更新时间:2023-12-03 13:31:13 26 4
gpt4 key购买 nike

monad 法则传统上用 >>= 来描述。和 pure :

pure a >>= k = k a
m >>= pure = m
m >>= (\x -> k x >>= h) = (m >>= k) >>= h

然而,monad 也可以用 join 来定义。而不是 >>= .我想根据 join 提出一个单子(monad)定律的表述。 .

使用 x >>= f = join (fmap f x) ,很容易重写现有的monad法则来消除 >>= .在应用定律的帮助下稍微简化了结果,前两个定律表达得非常愉快:
join . pure = id
join . fmap pure = id

这些定律的直觉也很容易,因为很明显,使用 pure 引入了一个额外的“层”。与 join 结合使用时应该是空操作.然而,第三定律并不是那么好。它最终看起来像这样:
  join (fmap (\x -> join (fmap h (k x))) m)
= join (fmap h (join (fmap k m)))

这不会令人愉快地减少使用应用定律,而且如果不盯着它看一会儿就很难理解。它当然没有同样简单的直觉。

是否存在根据 join 的单子(monad)定律的等效替代表述?这更容易理解?或者,有什么办法可以简化上述规律,或者更容易理解?带有 >>= 的版本已经不如 Kleisli 组合表达的好,但是带有 join 的版本几乎不可读。

最佳答案

直接从 Wikipedia 窃取:

(自然变换 η: 1 -> Tpure ;自然变换 µ: T^2 -> Tjoin )

µ . Tµ = µ . µT



在 haskell :
join . fmap join = join . join

英文:如果你从三层monad开始为 mmma :: Monad m => m (m (m a)) ,不管是先压内层后外层,还是先压外层后内层。这与您列为第三个(关联性)的定律相同。

µ . Tη = µ . ηT = 1



在 haskell :
join . fmap pure = join . pure = id
英文:如果你从一层monad开始为 ma :: Monad m => m a ,不管是在里面新建一个图层然后展平,还是在外面新建一个图层然后展平,都和什么都不做一样。这条定律是你前两条的结合。

另外, join作为一个自然的转变意味着
join . fmap (fmap f) = fmap f . join
因为参数化。

关于haskell - 用join而不是bind表示的Monad法则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45829110/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com