gpt4 book ai didi

scala - Monad 的左单位定律似乎不适用于 scala 中的列表。那么scala Lists不是monad吗?

转载 作者:行者123 更新时间:2023-12-01 07:47:51 26 4
gpt4 key购买 nike

Monads 的“左单位法则”:

unit(x) flatMap f == f(x)

但是:

(List(1) flatMap ((x: Int) => Some[Int](x))) == List(1) // true
((x: Int) => Some[Int](x))(1) == Some(1) // also true

所以左单位定律不适用于 scala 中的列表。那么列表不是单子(monad)吗?

最佳答案

首先,单子(monad)定律假设 f: A => M[A](这里是 f: A => List[A])。 (x: Int) => Some[Int](x) 不是这样。

第二,ListflatMap单子(monad)绑定(bind)。它比绑定(bind)更通用,因为它需要一个隐式的 CanBuildFrom ,允许它根据您希望它返回的内容更改其返回类型。你可以限制它像这样绑定(bind)

def bind[A](xs: List[A])(f: A => List[A]) = xs.flatMap(f) // implicit (List.canBuildFrom)

现在您可以看到满足法律要求:

bind(List(1))(x => List(x, x)) == List(1, 1)

关于scala - Monad 的左单位定律似乎不适用于 scala 中的列表。那么scala Lists不是monad吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45002864/

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