使用Scala的2.7.7:如何使用高階函數來平坦化選項列表?
如果我有選擇的名單,我可以用一個換理解它們壓平:
val listOfOptions = List(None, Some("hi"), None)
listOfOptions: List[Option[java.lang.String]] = List(None, Some(hi), None)
scala> for (opt <- listOfOptions; string <- opt) yield string
res0: List[java.lang.String] = List(hi)
我不喜歡這種風格,而寧願使用HOF。這種嘗試是太冗長是可以接受的:
scala> listOfOptions.flatMap(opt => if (opt.isDefined) Some(opt.get) else None)
res1: List[java.lang.String] = List(hi)
憑直覺我本來期望下面的工作,但它並不:
scala> List.flatten(listOfOptions)
<console>:6: error: type mismatch;
found : List[Option[java.lang.String]]
required: List[List[?]]
List.flatten(listOfOptions)
即使下面似乎像它應該工作,但沒有按「T:
scala> listOfOptions.flatMap(_: Option[String])
<console>:6: error: type mismatch;
found : Option[String]
required: (Option[java.lang.String]) => Iterable[?]
listOfOptions.flatMap(_: Option[String])
^
我能想出的最好的是:
scala> listOfOptions.flatMap(_.toList)
res2: List[java.lang.String] = List(hi)
...但我寧願不必將選項轉換爲列表。這似乎笨重。
有什麼建議嗎?
哦,是的。謝謝!我曾經偶然碰到過flatMap(o => o),但很快就忘了它。爲什麼flatMap(_)不能同樣工作,這是一件奇怪的事情。 – Synesso 2010-05-24 07:03:19