gpt4 book ai didi

scala - 以 None 为起始值的折叠集合

转载 作者:行者123 更新时间:2023-12-04 23:21:29 26 4
gpt4 key购买 nike

我想折叠一个集合或 Y 并返回一个 Option[X]。我想从无开始。像这样...

def f(optX: Option[X], y: Y): Option[X]
val optX = collectionOfY.fold(None) { case (prev, y) => f(prev,y) }

添加不需要的类型以使其更清晰
val optX: Option[X] = collectionOfY.fold(None) { case (prev: Option[X], y: Y) => f(prev,y) }

但是,编译器无法正确识别类型,我必须这样写
val xx: Option[X] = None
val optX = collectionOfY.fold(xx) { case (prev, y) => f(prev,y) }

编写这个的神奇 Scala 语法是什么?

谢谢
彼得

最佳答案

只需使用 foldLeft以及以下任何一项
... foldLeft(Option.empty[X]) ...... foldLeft(None: Option[X]) ...... foldLeft[Option[X]](None) ...
毕竟,fold只需调用foldLeft .你只是真的想用fold当您的 A1真的是A的父类(super class)型,如果确实如此,那么您可以使用 fold如上所述,编译器将正确知道类型。

例如,Option[List[Int]] <: Option[Seq[Int]]通过协方差,所以我们没有得到 Any这里:

List(Some(List(1,2,3))).fold[Option[Seq[Int]]](None)((_, _) => Some(Seq(1)))

> res2: Option[Seq[Int]] = Some(List(1))

最后,如果你确实知道 Option[X]将是 Y 的父类(super class)型然后在 Y 的类型声明中明确说明这一点- 即 Y <: Option[X] , 那么你可以使用 fold使用上面给出的解决方案。

When should .empty be used versus the singleton empty instance?进行相关讨论。

关于scala - 以 None 为起始值的折叠集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25066863/

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