有Scala身份识别功能吗?

zvms9eto  于 2022-11-09  发布在  Scala
关注(0)|答案(4)|浏览(164)

如果我有类似于List[Option[A]]的东西,并且我想将其转换为List[A],标准方法是使用flatMap

scala> val l = List(Some("Hello"), None, Some("World"))
l: List[Option[java.lang.String]] = List(Some(Hello), None, Some(World))

scala> l.flatMap( o => o)
res0: List[java.lang.String] = List(Hello, World)

现在o => o只是一个恒等函数。我本以为会有办法去做:

l.flatMap(Identity) //return a List[String]

但是,我不能让它工作,因为您不能泛化object。我试了几种方法都无济于事;有人用过这样的东西吗?

7rtdyuoh

7rtdyuoh1#

有一个身份function in Predef

l flatMap identity[Option[String]]

> List[String] = List(Hello, World)

我想,A代表表达更好:

for(x <- l; y <- x) yield y

编辑:

我试图弄清楚为什么需要type参数(选项[字符串])。问题似乎出在从选项[T]到迭代[T]的类型转换上。
如果您将标识函数定义为:

l.flatMap( x => Option.option2Iterable(identity(x)))

可以省略type参数。

bkhjykvo

bkhjykvo2#

FWIW,在Scala2.8上只需调用flatten即可。Thomas在Scala 2.7中几乎涵盖了这一点。他只错过了使用这个身份的另一种方式:

l.flatMap[String](identity)

然而,它不能与运算符表示法一起工作(运算符表示法似乎不接受类型参数,这一点很好知道)。
您也可以在Scala2.7上*调用flatten(至少在List上),但如果没有类型,它将无法执行任何操作。但是,这是可行的:

l.flatten[String]
aor9mmx1

aor9mmx13#

您只需给类型推断器一点帮助:

scala> val l = List(Some("Hello"), None, Some("World"))
l: List[Option[java.lang.String]] = List(Some(Hello), None, Some(World))

scala> l.flatten[String]
res0: List[String] = List(Hello, World)
0ejtzxu1

0ejtzxu14#

Scala 3:

List(1,2,3).map(identity)

// val res0: List[Int] = List(1, 2, 3)

相关问题