是否有scala身份功能?

oxb*_*kes 65 functional-programming scala scala-option

如果我有类似的东西List[Option[A]],我想将其转换为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)
Run Code Online (Sandbox Code Playgroud)

现在o => o只是一个身份功能.我原以为会有办法:

l.flatMap(Identity) //return a List[String]
Run Code Online (Sandbox Code Playgroud)

但是,我不能让这个工作,因为你不能生成一个object.我试了几件事无济于事; 有没有人有这样的工作?

Tho*_*ung 61

Predef中有一个身份功能.

l flatMap identity[Option[String]]

> List[String] = List(Hello, World)
Run Code Online (Sandbox Code Playgroud)

对于表达来说,更好,我想:

for(x <- l; y <- x) yield y
Run Code Online (Sandbox Code Playgroud)

编辑:

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

如果将身份函数定义为:

l.flatMap( x => Option.option2Iterable(identity(x)))
Run Code Online (Sandbox Code Playgroud)

type参数可以省略.


Dan*_*ral 22

FWIW,在Scala 2.8上你只需要flatten它就可以了.托马斯主要用于Scala 2.7.他只错过了一种使用该身份的替代方式:

l.flatMap[String](identity)
Run Code Online (Sandbox Code Playgroud)

然而,它不适用于运算符表示法(似乎运算符表示法不接受类型参数,这很好知道).

您也可以调用flattenScala 2.7(List至少在a 上),但如果没有类型,它将无法执行任何操作.但是,这有效:

l.flatten[String]
Run Code Online (Sandbox Code Playgroud)