2009-11-25 17 views
58

Eğer bir List[Option[A]] gibi bir şeyim varsa ve bunu List[A]'a dönüştürmek istiyorsam, standart yol flatMap:Scala kimlik fonksiyonu var mı?

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) 

kullanmaktır. Şimdi o => o sadece bir kimlik işlevidir. Bunu yapmanın bir yolu olacağını düşünürdüm:

l.flatMap(Identity) //return a List[String] 

Ancak, object'yi üretemeyeceğiniz için bunu çalıştıramıyorum. Boşuna birkaç şey denedim; Çalışacak böyle bir şey var mı?

+2

ben '{_}' eşit gerektiğini düşünürdüm için '{x => x}' "{_ + 3}", {x => x + 3} 'e eşittir. Neden böyle olmadığını kimse yorumlayabilir mi? –

cevap

52

function in Predef numaralı bir kimlik var. anlatımda için

l flatMap identity[Option[String]] 

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

bir güzel, herhalde:

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

Düzenleme:

I tipi parametresi (Seçenek [dize]) tabi anlamaya çalıştı. Sorun Option [T] 'den Iterable [T]' ye tip dönüşüm olarak görünüyor.

siz kimlik işlev tanımlayacaksanız:

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

tür parametresi ihmal edilebilir.

+0

Yazım türü, türlerin kendisini nasıl tanımlayamaz? Neden l.flatMap (kimlik): List [String] 'çalışmıyor? –

+0

İnferörün bunu anlayabileceğini düşündüm. Hiç bir fikrim yok. Bir soru ekleyeceğim. :-) –

+1

@oxbow_lakes - Düzenlemeye bakın. Gizli tür dönüşümlerle ilgilidir. –

21

FWIW, Scala 2.8 üzerinde sadece flatten'u arayın. Thomas çoğunlukla Scala 2.7 için kaplıdır.

O operatör gösterimi ile çalışmayacak
l.flatMap[String](identity) 

Ancak (o bilmek güzel tip parametrelerini kabul etmez operatör notasyonu görünüyor): O sadece o kimliği kullanarak bir alternatif yol kaçırdı.

Sen Scala 2.7 üzerinde da çağrı flatten (a List üzerine, en azından), ama bir tip olmadan bir şey yapmak mümkün olmayacaktır olabilir. Ancak, bu işleri:

l.flatten[String] 
2

Sen sadece küçük bir yardım inferencer türü verebilir:

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) 
İlgili konular