"A list without a tail" case x :: xs => "A list with a tail"}如何允许匹配表达式x :: xs而不是List(x, xs)?" />

中缀运算符上的Scala匹配分解

list scala match infix-operator

2707 观看

3回复

6544 作者的声誉

我试图理解ListScala 中s 的实现。特别是我试图了解如何使用中缀运算符编写匹配表达式,例如:

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

如何允许匹配表达式x :: xs而不是List(x, xs)

作者: thatismatt 的来源 发布者: 2009 年 6 月 20 日

回应 (3)


7

19231 作者的声誉

我相信::实际上是一个类(它是List的子类),所以说x :: xs大致相当于List(x, xs)

您可以使用具有运算符名称的其他案例类来执行此操作。例如:

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

a match {
  case x %%% y => x + y
}
作者: Jay Conrod 发布者: 20.06.2009 06:52

13

45809 作者的声誉

决定

杰伊康拉德的回答几乎是正确的。重要的是,某处有一个名为的对象::实现了该unapply方法,返回了类型Option[(A, List[A])]。正是如此:

object :: {
  def unapply[A](ls: List[A]): Option[(A, 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特质。然而,如上面的例子示出了,它不具有是的情况下类的。

作者: Daniel Spiewak 发布者: 20.06.2009 08:48

2

1373 作者的声誉

如何将匹配表达式设为x :: xs而不是List(x,xs)?

要回答这个问题:

当被视为模式时,诸如p op q的中缀操作等同于op(p,q)。也就是说,中缀运算符op被视为 构造函数模式

(Scala编程,第1版,第331页)

另请参阅scala案例类问题

作者: Eugen Labun 发布者: 19.12.2010 09:43
32x32