パターンマッチングは使いやすいので素晴らしい機能です。
これは、広く使用されているオブジェクト指向言語のほとんどのデザインパターンよりもはるかに優れた「オブジェクトシステムに機能をもたらす方法」の問題を解決します。たとえば、アルゴリズムをオブジェクト構造から分離するビジターパターンがあります。クラスに触れることなくオブジェクトの動作を変更できるため、このアイデアは素晴らしいものです。しかし、反対側では、このパターンは表記法の過度の複雑さと冗長性に失敗します。パターンマッチングを使用すると、これを簡単に解決できます。
def calc(e: Expression): Double = e match {
case Num(n) => n
case Add(a, b) => calc(a)+calc(b)
case Sub(a, b) => calc(a)-calc(b)
...
}
これにより、ASTの計算がその定義から分離され、多形のビジターパターンよりもはるかに読みやすくなります。
パターンマッチングは非常に簡単なので、どこでも使用できます。ほとんどのオブジェクト指向言語では考えもしなかった場所で見つけることができます。優れた例は、代数的データ型(ADT)を使用して相互に通信するアクターです。
sealed trait Message
case class Hello(name: String) extends Message
case class Bye(name: String) extends Message
case class Question(q: Symbol) extends Message
class MySelf extends Actor {
def receive {
case Hello(name) => println("Hello "+name)
case Bye(name) => println("Buy "+name)
case Question('AreYouOk) => sender answer "I'm ok"
...
}
}
これをVisitorパターンで実装して、たくさんの楽しみをお祈りします。