2016-07-15 10 views
0

私は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のモナド値であり、その "モナド"メソッドのいくつかを使用していることがわかります。しかしそれはちょうど推測です。

答えて

2

あなたはflattenGenTraversableOnceに変換可能な値を含むコレクションで呼び出すことができることを参照してください。

def flatten[B](implicit asTraversable: A => GenTraversableOnce[B]): CC[B] 

Optioncompanion objectIterableへの暗黙的な変換が存在するので、flatten -edになる資格でなければなりません(IterableされますサブタイプはGenTraversableOnce)。

それは

...その実装は明らかである、ListOptionを変換私が間違っている場合は、 `、私が言っているだろう

+0

私の唯一の訂正は 's/it/its /'です。また、私は何かが明らかであるかどうかはわかりません。もう1つの答えはコードも示していますが、これも明白ではありません。それは明らかではありません。 –

+0

@ som-snytt、ありがとう、それを修正しました。 –

+0

非常に興味深い。私は暗黙の転換であるとは想像もできませんでした。 – user3663882

2

Flattenメソッドは、A(この場合はOption)を受け取り、GenTraversableOnceに変換できるメソッドを暗黙的に受け取ります。適用するとき、我々は空のリストを取得する意味

def toList: List[A] = 
    if (isEmpty) List() else new ::(this.get, Nil) 

implicit def option2Iterable[A](xo: Option[A]): Iterable[A] = xo.toList 

そして、反復処理可能に戻す前にオブジェクトが空かどうかをチェックToListメソッド:

Optionオブジェクトは、それに定義された暗黙のメソッドを持っていますoption2Iterable onなし。

のでライン:

b ++= asTraversable(xs).seq 

は、実際にはNoneまたはいくつかの場合、いくつかの値を持つリスト上で実行する場合bに空の配列を追加しています。

これは、平坦化された出力ではNone/Someオブジェクトが表示されず、Someオブジェクトの値のみが表示されるためです。

+2

...私はScalaのコレクションの実装と、あまりにも圧倒しています、私を修正してくださいそして、これはバージニア州で、なぜあなたは「None」を見ることができないのですか?https://en.wikipedia.org/wiki/Yes,_Virginia,_there_is_a_Santa_Claus –

関連する問題