微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

scala – 使用None作为起始值折叠集合

我想折叠一个集合或Y并返回一个选项[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) }

写这篇文章的神奇Scala语法是什么?

谢谢
彼得

解决方法

只需使用foldLeft和以下任何一项

… foldLeft(Option.empty [X])…或… foldLeft(无:选项[X])…或… foldLeft [选项[X]](无)…

毕竟,折叠只是调用foldLeft.当你的A1确实是A的超类型时,你真的只想使用fold,如果确实如此,你可以使用如上所述的fold,编译器将正确地知道类型.

例如,Option [List [Int]]&lt ;: Option [Seq [Int]]的协方差,所以我们在这里得不到任何一个

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

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

最后,如果你确实知道Option [X]将是Y的超类型,那么在Y的类型声明中明确地说明 – 即Y<:Option [X],那么你可以使用fold与上面给出的解决方案. 有关相关讨论,请参见When should .empty be used versus the singleton empty instance?.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐