gpt4 book ai didi

scala - 为什么 Option 不继承自 Seq 和 Set?

转载 作者:行者123 更新时间:2023-12-04 17:53:35 26 4
gpt4 key购买 nike

我有两个问题,但我希望答案是相互交织的。所以我在玩 flatMapping 不同的参数类型。我得到以下信息:

val s: List[String] = List("f2", "df", "e")     //> s  : List[String] = List(f2, df, e)
val o = s.map(s => if (s.head == 'f')Some(s) else None)
//> o : List[Option[String]] = List(Some(f2), None, None)
val o1 = s.flatMap(s => if (s.head == 'f')Some(s) else None)
//> o1 : List[String] = List(f2)
val a: Option[String] = Some("Hello") //> a : Option[String] = Some(Hello)
val a1 = a.map(s => s.toList) //> a1 : Option[List[Char]] = Some(List(H, e, l, l, o))

但是

val a2 = a.flatMap(s => s.toList) //gives
//type mismatch; found : List[Char] required: Option[?]

所以我试图理解 o1 编译而不是 a2 背后的逻辑。然后查看 Option 我想知道为什么 Option 不继承特征:Seq 和 Set? Option 是一个 Seq 因为它保持顺序,它是一个 Set 因为它不包含重复项。通过 Seq 和 Set 它将继承自 Iterable 和 Traversable。

最佳答案

所有 GenTraversableOnce 后代的假设是它们包含 任意 数量的元素。 API 和假设或依赖于它的机制太多,例如 BuilderCanBuildFrom

然而,在更深层次上,重要的是要认识到 for-comprehensions 和 map/flatMapmonadic 操作。 Monad 是不可互换的——你不能选择一个函数 A => N[B] 并将它传递给一个 M[A] 以获得一个 N[B ],对于任何 monad M 和 N,Option 和集合是 不同的 monad。

通过许多隐含的魔法,所有集合都被视为单个 monad,这导致人们认为所有 monad应该是可互换的,但事实并非如此。 p>

然后考虑这样一个简单的案例:

val x = Option(1)
val y = List('a', 'b', 'c')
val z = for {
a <- x
b <- y
} yield (a, b)

z的类型不能Option,因为结果有多个元素。让它工作的唯一方法是让它成为一个类似 Iterable 的东西。这可能对 Option 有意义,如果您将其视为最多一个元素的集合,但对于像 State 这样的东西就没有意义>阅读器单子(monad)。

说到将 Option 视为最多一个的集合,这是不这样做的另一个原因。 Option 应该被认为是一个元素的存在或不存在,而不是一个集合,以及有助于这种微妙区别的可用方法。再说一次,我知道很多人认为这个论点至少是完全虚假的,所以持保留态度。

关于scala - 为什么 Option 不继承自 Seq 和 Set?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19550862/

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