flatten是什么意思?

use*_*882 3 scala flatten

我试图理解定义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].什么<:<意思?

ube*_*ach 6

这是一个通用类型约束,它确保您展平的类型具有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类型系统的高级功能之一.


Cso*_*iss 5

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],正如其他答案解释它.