scala – 使用None作为起始值折叠集合
发布时间:2020-12-16 18:05:01 所属栏目:安全 来源:网络整理
导读:我想折叠一个集合或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)
我想折叠一个集合或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?. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读