我想折叠一个集合或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]]< ;: 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 举报,一经查实,本站将立刻删除。