在管道符斯卡拉匹配分解(Scala match decomposition on infix ope

2019-07-29 01:18发布

我想了解的执行List S IN斯卡拉。 特别是,我试图让我的头围绕如何,你可以使用中缀运算符,例如写匹配表达式:

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)

Answer 1:

周杰伦康拉德的答案是差不多吧。 最重要的是在某个地方有一个名为对象::它实现了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特质。 然而,如上面的例子示出了,它不必须是一个的情况下类的。



Answer 2:

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

您可以与具有操作员姓名等情况下的类做到这一点。 例如:

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

a match {
  case x %%% y => x + y
}


Answer 3:

比赛表现如何允许为x :: XS,而不是列表(x,XS)?

要回答这个问题:

当作为图案看到的那样,中缀操作,如对运算q是等同于运算(P,Q)。 也就是说,中缀操作符op被视为一个构造函数图案

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

另请参见Scala的case类问题



文章来源: Scala match decomposition on infix operator