0

我正在努力实现“简单”的行为:将模式匹配代码分成两个单独的函数。

为了清晰起见,我正在简化模型:

abstract class Animal
case object Dog extends Animal
case object Cat extends Animal
case object Bird extends Animal
case object Bat extends Animal
case object Dolphin extends Animal

我想在不同的函数上对这些进行模式匹配(因为实际代码很长),但是还有其他参数,所以 PartialFunctions 让我感到恶心......
在一个完美的世界里,我可以写:

type PF = PartialFunction[(Animal, Int, String), String] 
private def processFlying(a: Animal, n: Int, loc: String): PF = {
  a match {
    case Bird => n + " birds found in " + loc
    case Bat => n + " bats found in " + underground(loc)
  }
}
private def processMarine(a: Animal, n: Int, loc: String): PF = {
  a match {
    case Dolphin => n + " dolphins found in " + submarine(loc)
  }
}
private def processPet(a: Animal, n: Int, loc: String): PF = {
  a match {
    case Dog => n + " dogs found in " + loc
    case Cat => n + " cats found in " + loc
  }
}
def processAnimal(a: Animal, number: Int, location: String) = {
  val processAll = processFlying orElse processMarine orElse processPet
  processAll(a, n, location)
}

然而,这是行不通的。主要是因为我的函数中需要几个参数。“为什么你不使用元组?” 你可以说?好吧,我试过了,编译器不会停止抱怨预期类型与实际类型不同,并且与我的别名不同:(

任何帮助、提示或替代方法都会很有用!
干杯


编辑:我遵循了 Cyrille 的回答,但我还需要在比赛前进行一些工作,如下所示:

val processFlying: PF = {
  // doSomething, like declare a sub-function f
  {
      case (b: Bird, n, loc) => f(b)
      case (b: Bat, n, loc) => f(b)
  }
}
4

1 回答 1

2

您的问题是您正在混合方法定义和函数定义。

def processFlying(a: Animal, n: Int, loc: String): PF

是(您的周围对象的)方法的签名,它接受三个参数并返回 a PF,即 a PartialFunction[(Animal, Int, String), String]

所以,假设这个签名是你想要的,你只能得到 aPartialFunction如果你已经有了 a Animal, anInt和 a String...

您更可能想要的是定义一个PF值(不带参数),所以更像是

val processFlying: PF = {
  case (Bird, n, loc) => ...
  case (Bat, n, loc) => ...
}

编辑

要回答您的第二个请求(尽管这可能有点矫枉过正,因为将您的助手定义为私有 def 就可以完成这项工作),您总是可以将PF块放在闭包中:

val processFlying = {
  def f = ...
  val res = {
    case (Bird, n, loc) => f(...)
    case (Bat, n, loc) => f(...)
  }
  res
}

但是,您必须为PartialFunction定义块分配一个值,否则解析器将无法知道如何处理它。那只是因为s 块和闭包的PartialFunction定义case共享{}语法。

于 2017-04-04T16:42:16.987 回答