首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >flatten是什么意思?

flatten是什么意思?
EN

Stack Overflow用户
提问于 2016-07-07 18:47:03
回答 3查看 1.6K关注 0票数 3

我试图理解Some::flatten的定义,但遇到了麻烦。下面是它的外观:

代码语言:javascript
复制
def flatten[B](implicit ev: A <:< Option[B]): Option[B] =
  if (isEmpty) None else ev(this.get)

我不明白A <:< Option[B]的意思。<:<是什么意思?

EN

回答 3

Stack Overflow用户

发布于 2016-07-07 18:56:11

这是一个广义的类型约束,它确保您要展平的类型是Option[Option[T]] (或List[List[T]])形式的。它所做的是移除OptionList的一层。因此,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类型系统的高级特性之一。

票数 6
EN

Stack Overflow用户

发布于 2016-07-07 19:35:58

A <: B通常意味着AB的一个子类型。

反过来,A <:< B提供了这种子类型关系的证据,这本质上意味着有一种方法可以将A转换为B

函数flattenOption[+A]类的成员,它需要一个

implicit ev: A <:< Option[B]

也就是说,可以将您的类型A转换为Option[B]的一些证据。根据这些证据,从Option[A]开始,可以将其转换为Option[Option[B]],然后可以将其粉碎为单个Option[B],正如其他答案所解释的那样。

票数 5
EN

Stack Overflow用户

发布于 2016-07-07 19:06:40

扁平化,如果你把它放在容易的意思-解开(简化)输入

在选项的情况下,这意味着如果您有nullable或nullable,则简化为nullable的单个级别

代码语言:javascript
复制
Some(Some("a")).flatten = Some("a")

如果是Seq of选项,则意味着删除所有空值

代码语言:javascript
复制
Seq(Some("a"), None, Some("b")).flatten = Seq("a", "b")

如果是Seq of Seq,表示删除Seq level

代码语言:javascript
复制
Seq(Seq("a"), Seq(), Seq("b", "c")).flatten = Seq("a", "b", "c")
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38243502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档