我试图理解定义Some::flatten并遇到麻烦.以下是它的外观:
def flatten[B](implicit ev: A <:< Option[B]): Option[B] =
if (isEmpty) None else ev(this.get)
Run Code Online (Sandbox Code Playgroud)
我不明白的意思A <:< Option[B].什么<:<意思?
这是一个通用类型约束,它确保您展平的类型具有Option[Option[T]](或List[List[T]])形式.它做了什么删除了一层Option或List.所以Some(Some(3))变得Some(3),Some(None)变得无,None变成None.对于列表:List(List(1,2), List(3))变成List(1, 2, 3).
有一篇非常好的文章描述了标准库中通用类型约束的使用,可在此处找到.
编辑:正如@mavarazy所说,它也可以将Seq [Option [T]]压平为Seq [T].广义类型约束是一个非常强大的设备,我认为它是Scala类型系统的高级功能之一.
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],正如其他答案解释它.