我试图理解Some::flatten的定义,但遇到了麻烦。下面是它的外观:
def flatten[B](implicit ev: A <:< Option[B]): Option[B] =
if (isEmpty) None else ev(this.get)我不明白A <:< Option[B]的意思。<:<是什么意思?
发布于 2016-07-07 18:56:11
这是一个广义的类型约束,它确保您要展平的类型是Option[Option[T]] (或List[List[T]])形式的。它所做的是移除Option或List的一层。因此,Some(Some(3))变为Some(3),Some(None)变为None,None变为None。对于列表:List(List(1,2), List(3))变为List(1, 2, 3)。
有一篇非常好的文章描述了标准库中广义类型约束的使用,找到了here。
编辑:正如@mavarazy指出的那样,它还可以将Seq[OptionT]展平为SeqT。广义类型约束是一个非常强大的工具,我认为它是Scala类型系统的高级特性之一。
发布于 2016-07-07 19:35:58
A <: B通常意味着A是B的一个子类型。
反过来,A <:< B提供了这种子类型关系的证据,这本质上意味着有一种方法可以将A转换为B。
函数flatten是Option[+A]类的成员,它需要一个
implicit ev: A <:< Option[B]
也就是说,可以将您的类型A转换为Option[B]的一些证据。根据这些证据,从Option[A]开始,可以将其转换为Option[Option[B]],然后可以将其粉碎为单个Option[B],正如其他答案所解释的那样。
发布于 2016-07-07 19:06:40
扁平化,如果你把它放在容易的意思-解开(简化)输入
在选项的情况下,这意味着如果您有nullable或nullable,则简化为nullable的单个级别
Some(Some("a")).flatten = Some("a")如果是Seq of选项,则意味着删除所有空值
Seq(Some("a"), None, Some("b")).flatten = Seq("a", "b")如果是Seq of Seq,表示删除Seq level
Seq(Seq("a"), Seq(), Seq("b", "c")).flatten = Seq("a", "b", "c")https://stackoverflow.com/questions/38243502
复制相似问题