2016-05-20 11 views
0

私はスカラ座を学んだし、(99のScalaの問題から取られた)flatMapを使用して、以下のコードでは、私はScala flatMap、msとeとは何ですか?

def myflatten(somelist : List[Any]): List[Any] = somelist flatMap { 
    case ms: List[_] => flatten(ms) 
    case e => List(e) 
} 

を持っている今、イム完全に混乱して何ミリ秒 'と「e」がありますか?彼らは私がmsをddと言うように変えるかのように何かキーでなければならない、私はエラー "not found value ms"を得る。私がそれらの上にマウスを置くと、「ms」が「List [] []」であり、「e」が「Any」であるというツールチップが得られます。

私は "Scala List elements ms and e"または "Scala flatMap ms and e"または "Scalaの場合はどのようにするのですか?"しかし、私はこれらの「ms」と「e」が何であるかを説明するものは見つけられていないようです。

キーワードはありますか? Scalaのドキュメントでどこで情報を見つけることができますか?

P.S.私はコードを理解していますが、msとeは何もありません

答えて

4

新しい場合は、ここで何が起こっているのかを段階的に説明してください。 mseは何

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は本質的に同じ(同じ要素)リストを返すからです。あなたの代わりにflatMapmapを使用する場合に何が起こるか

チェックアウト:

val x = List("Str1", "Str2", "Str3") 
val y = x map { elementInList => List(elementInList) } 

valyは次のようになります。

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

emsは何ですか?

はあなたのコードを見てみましょう:

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と比較している一般的に

リス

2

ここではタイプ要素の型付き一致です。 msはキーワードではなく、タイプListの要素を表す単なる変数です。

そしてcase eは可変マッチングであり、すべてのシナリオを捕まえることのようなものです。 Listではないすべての要素に一致します(Listは最初のケースと一致します)。再度はキーワードでもありません。それは、変数名のみだ - あなたはKinds of patterns

1

MS、電子を読むことができる詳細情報については

。あなたはあなたが望むようにそれらを呼び出すことができます。最初のケースで

case ms: List[_] => flatten(ms) 

あなたは[_]リストの内容

def myflatten(somelist : List[Any]) 

が一覧として一致させることができると仮定し、あらゆるタイプ

の第二のcase文には:

case e => List(e) 

あなたのリストの内容は他のものにすることができます。 http://docs.scala-lang.org/tutorials/tour/pattern-matching.html

そして、ここでいくつかのチュートリアル:https://kerflyn.wordpress.com/2011/02/14/playing-with-scalas-pattern-matching/ はScalaのパターンマッチングに関するいくつかの背景を得るために

は、公式ドキュメントを読んでください。

-1

がeで指定された場合のデフォルトです。あなたがリスト[_]を持っている場合は、フラットマップを実装するか、指定した2番目のオプションを実装します

関連する問題