2011-02-01 8 views
4

私は自分自身にスカラを教えています。私はある種の哲学的な質問をしています。パターン一致は言語のScalaの機能か、または単にライブラリ機能ですか?別の言い方をすると、私は十分に熟練していましたか?xmatch、名前以外のすべての点でmatchと同じ機能を書くことができますか?実際には、私はそれらが2つのわずかに異なる質問だと思います:ライブラリの機能と一致すると、それはライブラリの機能ですか?言語機能に一致していますか?

純粋に練習として試合を書き直そうと思っていましたが、可能だったと確信していました。

答えて

5

パターンマッチングは言語機能であり、そのうちのmatchステートメントは最も顕著な例です。他にもよく使われる2つの例があります:

val List(x,y,(z: Int,w: Int)) = List("one","two",(3,4)) 
for ((text,i) <- List(("one",1),("two",2))) println(text + " = " + i) 

あなた自身ではできません。この言語では、変数を作成する新しい方法を定義することはできないため、これらのことは言語サポートでのみ発生する可能性があります。

matchステートメント自体は、言語内のパターンマッチング可変作成サポートを使用しますが、原則としてライブラリフィーチャーとして実装できます。しかし、それはいくつかのケースでは効率が悪い:だから

// This is implemented with fast jumps, not slow if-then-else! 
n match { 
    case 0 => // Do action 0 
    case 1 => // Do action 1 
    case 2 => // Do action 2 
    case _ => // Do default action 
} 

// This is tail recursive, so you won't overflow the stack! 
def recursiveMatch(xs: List[Any]): List[Any] = xs match { 
    case (x @ Int) :: rest => recursiveMatch(rest) 
    case _ => xs 
} 

、すべてのすべての、いや、あなたは自分自身にマッチするパターンを書き込むことができない、とあなたが一致文を書くことができながら、使用することに利点がある既存の1。

2

パターンマッチングは間違いなく言語機能です。つまり、Scalaでの制御フロー構造の作成は非常に簡単で(パターンマッチングは堅牢です)、自分でmatch(他の言語と比較して)を簡単に書くことができます。

matchは、まだ言語コアの一部です(私は思っています)が、それはライブラリの中で何かのように動作します。パワフルなパターンマッチングがいかに大事なのか、とても有機的だと感じています。

つまり、ええ、あなたは間違いなくmatchを書き換えることができます。

+0

この回答には本当の答えはないようです。それはすべてふわふわした言葉であり、賞賛します... – ziggystar

4

実際にはmatchがライブラリに実装されていましたが、私は聞いたことがあります。 Scala ReferenceのChange Logは、matchがバージョン2.0で予約されたキーワードであり、その時点でobject.match { ... }も有効な構文でなくなったことを示しています。

原理的には、それを実装するのではなく簡単です:

implicit def toMyMatch[T](obj: T) = new { 
    def myMatch[R](f: T => R) = f(obj) 
} 

私はそれがこの方法を実装することをやめた理由は、正確な理由は分かりません。

+1

正確な理由は?メソッドとして 'match'を使うと、部分関数の内部で行われる末尾呼び出しの末尾呼び出しの最適化が妨げられている可能性があります。 –

+0

これはケース分析をどのように許可しますか? –

+1

@pelotom 'f'はそのための部分的な関数でなければなりません。上記のスニペットを 'def myMatch [r](f:PartialFunction [T、R])= f(obj)' –

関連する問題