是否存在 Scala 恒等式函数?

如果我有一个类似于 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。我尝试了一些东西,但是没有用; 有人有这样的东西吗?

35734 次浏览

有一个身份 在 Predef 发挥作用

l flatMap identity[Option[String]]


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

我想,A for 的表达方式更好一些:

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

编辑:

我试图弄清楚为什么需要 type 参数(Option [ String ])。问题似乎是从 Option [ T ]到 Iterable [ T ]的类型转换。

如果将标识函数定义为:

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

可以省略 type 参数。

FWIW,在 Scala 2.8上你只需要调用 flatten就可以了。托马斯基本上涵盖了 Scala 2.7。他只是漏掉了一种使用这个身份的替代方式:

l.flatMap[String](identity)

但是,它不适用于运算符表示法(似乎运算符表示法不接受类型参数,这是很好的了解)。

您可以在 Scala 2.7上(至少在 List上)调用 还有,但是它不能在没有类型的情况下做任何事情。然而,这种方法是有效的:

l.flatten[String]

你可以给类型推断器一点帮助:

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)

Scala 3:

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


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