私はIterator[Option[T]]
を持っていると私はそれらOption
のT
isDefined
ためIterator[T]
を取得したいです。これよりも良い方法があるに違いありません:Scalaは
it filter { _ isDefined} map { _ get }
私はそれが一方の構築物でできたと思っているだろう...誰任意のアイデア?
val it: Iterator[Option[T]] = ...
val flatIt = it.flatten
私はIterator[Option[T]]
を持っていると私はそれらOption
のT
isDefined
ためIterator[T]
を取得したいです。これよりも良い方法があるに違いありません:Scalaは
it filter { _ isDefined} map { _ get }
私はそれが一方の構築物でできたと思っているだろう...誰任意のアイデア?
val it: Iterator[Option[T]] = ...
val flatIt = it.flatten
私のために働く(Scala 2.8):
it.collect {case Some(s) => s}
これ:it
はit
これは現在可能であるより新しいバージョンでIterator
val it:Iterator[Option[T]] = ...
it.flatMap(x => x elements) //returns an Iterator[T]
it.flatMap(_ elements) //equivalent
私にとって、これはモナドUIの古典的な使用例です。
for {
opt <- iterable
t <- opt
} yield t
これは、前述したflatMap
解決のためだけに砂糖だし、それは同じバイトコードを生成します。しかし、構文は重要ですが、スカラのモナドfor
構文を使用する最も良い時期の1つは、特にコレクションと組み合わせてOption
を使用している場合です。
私はこの定式化がかなり読みやすく、特に関数型プログラミングに精通していない人にとってはそうだと思います。私はしばしば、ループのモナディック表現と関数表現の両方を試し、どちらがより単純かを見てみましょう。私はと思うflatMapはgrok(そして実際にはそれを>>=
と呼ぶとわかりやすくなります)の大部分の人にとっては難しい名前です。
スケーラユーザメーリングリストからあなたが誰であるかを知っていれば、私は確信しています(現時点ではScala dev envtにアクセスできません:-)。これがどのように機能するか少し説明できますか?私は馬鹿ではないと約束しますが、スカードからこれを取得するはずです。 –
"flatMap {_ elements}"ではないでしょうか? (私は再びscaladocを読んだことがあります!) –
StackOverflowでもっと多くのScalaの達人を見てうれしいです。 scala-userメーリングリストは私の受信トレイを休憩/継続より難解な引数で埋めています: –