web-dev-qa-db-ja.com

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を生成できないため、これを機能させることはできません。私は役に立たないいくつかのことを試みました。誰かがこのような何かを手に入れましたか?

64
oxbow_lakes

アイデンティティがあります 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パラメーターは省略できます。

59
Thomas Jung

FWIW、Scala 2.8では、単にflattenを呼び出します。 Thomas は、Scala 2.7 。彼はそのアイデンティティを使用する1つの代替方法を逃しただけです。

l.flatMap[String](identity)

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

また、alsoflatten on Scala 2.7(Listで、少なくとも)、しかし型なしでは何もできませんが、これは動作します:

l.flatten[String]
22

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

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)
2
David Winslow