2009-11-25 7 views
58

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

+2

を私は 'その' {_} 'と同じである必要があります' {X => x}が思うだろう'{_ + 3}'は '{x => x + 3}'と同じです。誰もそれがそうでない理由についてコメントすることはできますか? –

答えて

52

IDはfunction in Predefです。 expresionため

l flatMap identity[Option[String]] 

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

Aが進歩して、私は考えます:

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

編集:

私は型パラメータ(オプション[文字列])が必要な理由を把握することを試みました。この問題は、Option [T]からIterable [T]への型変換のようです。

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

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

型パラメータを省略することができます。

+0

どのように型推論が型自体を把握できないのでしょうか?なぜl.flatMap(identity):List [String] 'が動作しないのですか? –

+0

私は推論者がそれを理解できると思った。何も思いつきません。私は質問を追加します。 :-) –

+1

@oxbow_lakes - 編集を参照してください。暗黙の型変換に関連しています。 –

21

FWIW、Scala 2.8の場合は、flattenを呼び出してください。 ThomasはScala 2.7を対象としています。彼は唯一のそのIDを使用してのいずれかの代替方法を逃した:

l.flatMap[String](identity) 

それはオペレータの表記では動作しません(ただし、知って良いとする、オペレータの表記は型パラメータを受け付けませんようです)。

あなたはScalaの2.7上コールflattenListには、少なくとも)が、タイプせずに何かをすることはできませんすることができます。しかし、この作品:

l.flatten[String] 
2

あなたはほんの少しの助け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) 
関連する問題