私はflatten
メソッドがどんな種類の魔法をしているのか理解しようとしています。ここには例文があります。this articleGenericTraversableTemplate :: flatten。それはどんな魔法ですか?
def toInt(s: String): Option[Int] = {
try {
Some(Integer.parseInt(s.trim))
} catch {
// catch Exception to catch null 's'
case e: Exception => None
}
}
scala> val strings = Seq("1", "2", "foo", "3", "bar")
strings: Seq[java.lang.String] = List(1, 2, foo, 3, bar)
scala> strings.map(toInt)
res0: Seq[Option[Int]] = List(Some(1), Some(2), None, Some(3), None)
scala> val flattenResult = mapResult.flatten
flattenResult: Seq[Int] = List(1, 2, 3)
Wowです。いくつかの奇跡のように見えます。 flatten
メソッドは、結果のコレクションにNone
を追加すべきでないことをどのように知っていますか?具体的な実装方法は明らかではありません。
def flatten[B](implicit asTraversable: A => /*<:<!!!*/ GenTraversableOnce[B]): CC[B] = {
val b = genericBuilder[B]
for (xs <- sequential)
b ++= asTraversable(xs).seq
b.result()
}
それは一般的に何を意味しますか?たぶんそれは、None
がのモナド値であり、その "モナド"メソッドのいくつかを使用していることがわかります。しかしそれはちょうど推測です。
私の唯一の訂正は 's/it/its /'です。また、私は何かが明らかであるかどうかはわかりません。もう1つの答えはコードも示していますが、これも明白ではありません。それは明らかではありません。 –
@ som-snytt、ありがとう、それを修正しました。 –
非常に興味深い。私は暗黙の転換であるとは想像もできませんでした。 – user3663882