74

私がのようなものを持っていて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。私は役に立たないいくつかのことを試みました。誰かがこのようなものを機能させることができますか?

4

3 に答える 3

70

Predefには恒等関数があります。

l flatMap identity[Option[String]]

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

表現のための方が良いと思います:

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

編集:

タイプパラメータ(Option [String])が必要な理由を理解しようとしました。問題は、Option[T]からIterable[T]への型変換にあるようです。

恒等関数を次のように定義する場合:

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

typeパラメータは省略できます。

于 2009-11-25T15:12:32.377 に答える
23

FWIW、Scala 2.8では、あなたはflattenそれを呼び出すだけです。Thomasは主にScala2.7をカバーしています。彼はそのアイデンティティを使用する1つの代替方法を逃しただけです:

l.flatMap[String](identity)

ただし、演​​算子表記では機能しません(演算子表記は、型パラメーターを受け入れないようです。これは知っておくと便利です)。

Scala 2.7を呼び出すことできますが(少なくとも、では)、型がないと何もできません。ただし、これは機能します。flattenList

l.flatten[String]
于 2009-11-25T18:19:44.137 に答える
4

型推論器に少し助けを与えることができます:

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)
于 2009-11-25T21:03:54.367 に答える