新しい場合は、ここで何が起こっているのかを段階的に説明してください。 ms
とe
は何
def myflatten(somelist : List[Any]): List[Any] = somelist flatMap { something =>
something match {
case ms: List[_] => flatten(ms)
case e => List(e)
}
}
を:?冗長に書かれ
def myflatten(somelist : List[Any]): List[Any] = somelist flatMap {
case ms: List[_] => flatten(ms)
case e => List(e)
}
まずはこれを解消しましょう。
List[Any]
でフラットマッピングしています。
val x = List("Str1", "Str2", "Str3")
val y = x flatMap { elementInList => List(elementInList) }
これは、リスト内の各要素について、その要素を含む新しいリストを作成することを意味します。そのflatMap
は本質的に同じ(同じ要素)リストを返すからです。あなたの代わりにflatMap
のmap
を使用する場合に何が起こるか
チェックアウト:
val x = List("Str1", "Str2", "Str3")
val y = x map { elementInList => List(elementInList) }
val
y
は次のようになります。
List(List("Str1"), List("Str2"), List("Str3"))
は冗長な例を見て、今http://www.brunton-spall.co.uk/post/2011/12/02/map-map-and-flatmap-in-scala/
をチェックしてください:
def myflatten(somelist : List[Any]): List[Any] = somelist flatMap { something =>
something match {
case ms: List[_] => flatten(ms)
case e => List(e)
}
}
あなたはリスト内の要素、この場合はsomething
と一致しています。 あなたはまた、要素type
でマッチしています。
def myMatch(e: Any): String = {
e match {
case x: String => "Its a String: " + x
case y: Int => "Its a Int: " + y
//notice how im using x twice.. its because they're in separate scope!
case x: Boolean => "Its a Boolean: " + x
case _ => "Its something else!"
}
}
例えば
はPARAM "hello"
でmyMatch
を呼び出し、それが"Its a String: hello"
を返します。
myMatch
をパラメータ1
で呼び出すと、"Its a Int: 1"
が返されます。
チェックアウトhttp://docs.scala-lang.org/tutorials/tour/pattern-matching.html
e
とms
は何ですか?
はあなたのコードを見てみましょう:
def myflatten(somelist : List[Any]): List[Any] = somelist flatMap {
case ms: List[_] => flatten(ms)
case e => List(e)
}
我々は現在見ているリスト内の要素がタイプList[_]
(List[Any]
と同じ)である場合、我々は、このブロック、flatten(ms)
を実行します。 ms
は、一致した要素に割り当てられたval
です。
現在見ているリストの要素のタイプが_
または本質的にデフォルト(case _ =>
)の場合、参照していた要素である1つの要素を含むList(e)
を返します。
これは常にList[List[Any]]
を返します。その後、平らにされてList[Any]
になります。私はこれが役に立てば幸い
、あなたがいずれかのリストや他の1つを有する二つの異なる例(IE)の場合のMSと比較している一般的に
リス