是否有scala身份功能?

时间:2009-11-25 15:00:16

标签: scala functional-programming scala-option

如果我有类似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。我试了几件事无济于事;有没有人有这样的工作?

3 个答案:

答案 0 :(得分:59)

有一个身份function in Predef

l flatMap identity[Option[String]]

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

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

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

修改

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

如果您将身份功能定义为:

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

可以省略type参数。

答案 1 :(得分:22)

FWIW,在Scala 2.8上,您只需拨打flatten即可。 Thomas主要涵盖了Scala 2.7。他只错过了一种使用该身份的替代方式:

l.flatMap[String](identity)

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

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

l.flatten[String]

答案 2 :(得分:2)

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

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)