2010-12-22 2 views
11

私はいくつかのスカラコードを勉強しています。マッチステートメントでは、[email protected]構成体は何ですか?それにはどのような価値が含まれていますか?私がそれを印刷したときにtailよりもdiffはありませんでしたが、tailと置き換えると、関数はdiffの結果を返します。誰かがそれが何であるかを説明し、それを理解するための正しいリソースを指摘できますか? (私はグーグルで検索することができます知っているが、何を探すべきかわかりません。)スカラ "マッチ"ヘルプ

この場合
def flatMapSublists[A, B](ls: List[A])(f: (List[A]) => List[B]): List[B] = 
    ls match { 
     case Nil => Nil 
     case [email protected](_ :: tail) => f(sublist) ::: flatMapSublists(tail)(f) 
    } 
+0

通常、アノテーションには '@ 'が使われますが、ここでは何も見えません。 –

答えて

28

私はそれを「あなたのケーキを食べて、あまりにも操作している」と呼ぶでしょう。パターンマッチングのどのレベルでも、パーツに@(@の前に)名前を付け、それをさらに(@の後ろに)解体することができます。たとえば、あなたは3つの要素を持つリストに対して一致させたい想像し、あなたは第二の要素を必要としていますが、全体のリストを記録したい:

something match { 
    case [email protected](_,elem,_) => log("matching:" + list); elem  
    case _ => error("not found") 
} 

この機能がない、あなたは

something match { 
    case List(a,elem,b) => log("matching:" + List(a,elem,b)); elem  
    case _ => error("not found") 
} 
ようなものを書かなければなりませんでした

ご覧のとおり、最初の要素と3番目の要素の名前を付ける必要があります。なぜなら、同じ構造のリストを定型文として取得する必要があるからです。両方とも右側に必要な場合は、全体の名前(list)と構造内の深い部分(elem)を与えることができれば、はるかに簡単で分かりやすくなります。

+0

すごい説明。ありがとう!! –

8

は、サブリストは、リスト全体(_ :: tail)ためという名前の変数になります。 tailはリストの末尾です。ここに「@」の名前があるかどうかは分かりません。

lsを直接参照できるので、ここではサブリストの目的は実際にはわかりません。

免責事項:私はスカラーを初めて使っています。私はこの権利があることを願っています。

+1

ハスケル(とMLも同様)です。 – delnan

+0

お返事ありがとうございます。両方の答えが私を理解するのに役立ちました。 –

+10

これは、言語リファレンスで「パターンバインダー」と呼ばれています。 – Debilski