2011-02-01 65 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