2009-06-20 11 views
9

私はScalaのListの実装について理解しようとしています。特に、私はあなたが、たとえば、中置演算子を使用して一致式を書くことができますどのようにまわりで私の頭を取得しようとしている:埋め込み演算子のスカラマッチ分解

a match { 
    case Nil => "An empty list" 
    case x :: Nil => "A list without a tail" 
    case x :: xs => "A list with a tail" 
} 

一致式が​​いうよりList(x, xs)ことが許されている方法は?

答えて

13

ジェイ・コンラッドの答えはほぼ正しいです。重要なことはどこかです::というオブジェクトがあり、unapplyメソッドを実装し、戻り値の型はOption[(A, List[A])]です。 Thusly:

object :: { 
    def unapply[A](ls: List[A]) = { 
    if (ls.empty) None 
    else Some((ls.head, ls.tail)) 
    } 
} 

// case objects get unapply for free 
case object Nil extends List[Nothing] 

::Listの場合、このオブジェクトは、::List形質を拡張する場合のクラスであるという事実から来て起こります。しかし、上の例が示すように、にはケースクラスとなるのはではありません。

7

私は:: is actually a class(これはListのサブクラスです)と考えています。したがって、​​はほとんどList(x, xs)に相当します。

これは、オペレータ名を持つ他のケースクラスでも実行できます。例えば:

case class %%%(x: Int, y: Int) 

a match { 
    case x %%% y => x + y 
} 
2

マッチ式はどのようにList(x、xs)ではなくx :: xsにすることができますか?

この質問に答えるために:パターンとして見た場合

を、そのようなPオペアンプQとしてインフィックス 動作 にOP(P、Q)等価です。つまり、中置の 演算子opは、 のコンストラクタパターンとして扱われます。

(スカラ座でのプログラミング、第一版、P。331)

も参照してくださいscala case classes questions

関連する問題