Scala递归函数返回Either

时间:2017-03-14 20:58:11

标签: scala pattern-matching either

我正在编写一个返回False或值列表的递归函数。

def parse(chars: List[Char]): Either[List[Char], Boolean] = {
  if (chars.length == 1)
    chars
  else {
    val head = chars.head
    val tail = parse(chars.tail)
    tail match {
      case Left(l) => {
        if (are_equal(head, tail.head))
          head :: tail
        else if (are_cancelled(head, tail.head))
          tail.tail
        else
          false
      }
      case Right(b) => false
    }
  }
}

我收到错误:value head is not a member of Either[List[Char],Boolean],但只应在匹配列表后使用head方法。

1 个答案:

答案 0 :(得分:4)

模式匹配tail match { ... }并没有神奇地改变您匹配的值的类型。 tail仍然是EitherEither没有会员head。但是l List,因此请将tail.head替换为l.head,依此类推。

您可以尝试插入显式类型注释以使事情更清晰。

您的退货类型在一些地方也是错误的。这是一个更接近编译的版本:

def parse(chars: List[Char]): Either[List[Char], Boolean] = {
  if (chars.length == 1) {
    Left(chars)
  } else {
    val head = chars.head
    val tail = parse(chars.tail)
    tail match {
      case Left(l) =>
        if (are_equal(head, l.head))
          Left(head :: l)
        else if (are_cancelled(head, l.head))
          Left(l.tail)
        else
          Right(false)
      case Right(b) => Right(false)
    }
  }
}