匹配语言功能?

时间:2011-02-01 03:39:43

标签: scala pattern-matching

我在教自己斯卡拉,我有一个哲学问题。模式匹配Scala的语言功能,还是仅仅是库功能?换句话说,我是否有足够的技巧,可以写xmatch,除了名字以外,每个方面都有match相同的功能?实际上,我认为这些是两个略有不同的问题:匹配库功能,可以它是一个库功能吗?

我正在考虑重新编写匹配,纯粹是作为一种练习,但我希望有一些保证它是可能的。

3 个答案:

答案 0 :(得分: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
}

所以,总而言之,不,你不能自己编写模式匹配,虽然你可以编写匹配语句,但使用现有模式有优势。

答案 1 :(得分:4)

实际上,我已经听说过match曾经在图书馆实施过。 Scala参考中的更改日志表明match在2.0版本上成为保留关键字,此时object.match { ... }也不再是有效语法。

原则上很容易实现它:

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

我不知道为什么它不再以这种方式实施的确切原因。

答案 2 :(得分:2)

模式匹配绝对是一种语言功能。也就是说,因为在Scala中编写控件流结构非常简单(并且模式匹配很强大),所以您可以轻松编写自己的match(与其他语言相比)。

另一方面,

match仍然是语言核心的一部分(我认为),但它的行为更像是库中的东西。由于模式匹配的强大程度,它感觉非常有机。

那就是说,是的,你绝对可以重写match