2009-06-20 40 views
9

我想了解斯卡拉的List s的實現。特別是,我試圖讓我的腦袋周圍如何使用中綴運算符寫匹配表達式,例如:中綴運算符的斯卡拉匹配分解

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])]。正是如此:

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

如何讓匹配表達式成爲x :: xs而不是List(x,xs)?

爲了回答這個問題:

當作爲圖案,中綴 操作如p運算q相當於 到運算(P,Q)看出。也就是說,操作符op的中綴 被視爲 構造函數模式

(Scala中編程,第1版,331頁)

參見scala case classes questions