Scalaのアイデンティティ機能はありますか?
-
22-09-2019 - |
質問
私は
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
をgenerifyことができないとして、しかし、私は仕事にこれを取得することはできません。私は無駄にいくつかのことを試してみました。誰もが仕事に、このようなものを持っている?
解決
アイデンティティ機能はPredef のでありますます。
l flatMap identity[Option[String]]
> List[String] = List(Hello, World)
expresion用Aが進歩して、私が思うます:
for(x <- l; y <- x) yield y
の編集の
I型パラメータ(オプション[文字列])が必要とされる理由を理解することを試みました。問題は、反復処理可能[T]のオプションから型変換[T]であると思われる。
あなたのように恒等関数を定義する場合:
l.flatMap( x => Option.option2Iterable(identity(x)))
型パラメータを省略することができる。
他のヒント
FWIWは、Scalaの2.8上で、あなたはそれにflatten
を呼び出します。それはほとんどのScala 2.7のためにカバーしているのトーマス。彼は唯一のそのIDを使用してのいずれかの代替方法を逃します:
l.flatMap[String](identity)
それはないでしょうオペレータ表記との仕事は、しかし、(これはオペレータの表記が知ってもいいである、型パラメータを受け付けませんようです)。
あなたは(少なくともflatten
上、)スカラ座2.7ののものコールList
ことができますが、タイプせずに何かをすることはできません。しかし、この作品ます:
l.flatten[String]
あなたはほんの少しの助けinferencer種類を与えることができる:
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)
所属していません StackOverflow