2011-02-01 66 views
4

我在教自己斯卡拉,我有一個哲學問題。模式是否與Scala的語言功能匹配,或者僅僅是庫功能?換一種說法,我可以,我是否足夠熟練,請寫xmatch,這個函數除了名字之外在其他方面都與match相同?其實,我認爲這是兩個稍有不同的問題:匹配庫功能,可能它是一個庫功能?是否匹配語言功能?

我正在考慮重新寫匹配,純粹是作爲一個練習,但我希望有一些保證是可能的。

回答

5

模式匹配是一種語言功能,其中match語句只是最顯着的例子。這裏有兩個其他常用的例子:

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 
} 

所以,一切的一切,不,你不能寫模式匹配自己,而你可以寫的匹配語句,也有使用的優勢已有一。

2

模式匹配絕對是一種語言功能。也就是說,因爲在Scala中編寫控制流結構非常簡單(並且模式匹配是健壯的),您可以輕鬆編寫自己的match(與其他語言相比)。另一方面,

match仍然是語言核心的一部分(我認爲),但它的行爲更像是圖書館中的某些東西。由於模式匹配有多強大,因此感覺非常有機。

這就是說,是的,你肯定可以重寫match

+0

這個答案似乎沒有真正的答案。這是所有蓬鬆的話和讚美... – ziggystar 2011-02-01 16:34:47

4

其實,match以前是在庫中實現的,我聽說過。 Scala參考中的更改日誌表示match成爲2.0版的保留關鍵字,此時object.match { ... }也不再是有效的語法。

這是相當容易實現它的原理:

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

我不知道確切的原因,它不再被這種方式來實現。

+1

確切的原因?可能是因爲使用「匹配」作爲方法可以防止部分函數內部尾部調用的尾部調用優化。 – 2011-02-01 04:17:52