scala - 将 PartialFunction 与常规函数组合

标签 scala combinators partialfunction

所以,假设我想为 PartialFunction 提供一个“包罗万象”的回退:

 val foo: PartialFunction[Int, String] = { case 1 => "foo" }
 val withDefault = foo orElse { _.toString }

这不会编译:缺少扩展函数的参数类型 ((x$1) => x$1.toString)。 这个:

  val withDefault = foo orElse { case x: Int => x.toString }

也不编译(同样的错误)。

这个:

val withDefault = foo orElse { (x: Int) => x.toString }

类型不匹配而失败;发现:整数=>字符串;必需:PartialFunction[?,?]

我能找到让它工作的唯一方法是拼出整个事情:

val withDefault = foo orElse PartialFunction[Int, String] { _.toString }

有没有更好的语法?我的意思是,无需 告诉它我正在将一个从 int 到 string 的部分函数传递到它期望接收从 in 到 string 的部分函数的地方。这一点都没有歧义,我为什么要这样做?

最佳答案

也许你需要applyOrElse:

val withDefault = foo.applyOrElse(_: Int, (_: Int).toString)

或者你可能会喜欢这样的东西:

implicit class PartialFunToFun[A,B](val f: PartialFunction[A,B]) extends AnyVal {
  def withDefault(bar: A => B) = f.applyOrElse[A,B](_: A, bar)
}

并使用它:foo.withDefault(_.toString)(1)

此外,如果您只想获得另一个 PartialFunction,您可以使用以下语法:

val withDefault = foo.orElse[Int, String]{case x => x.toString}

关于scala - 将 PartialFunction 与常规函数组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38357710/

相关文章:

xml - 在 Ruby 中解析 XML 标记时如何获取所有内容的总和?

来自具体函数的 Scala 偏函数

scala - 在 Scala 中使用运算符 orElse 的正确方法是什么?

Scala扩展while循环到do-until表达式

java - 如果我尝试将值放入 View 类中的 map 中,为什么会出现错误?

scala - Akka-http 非法请求头

scala - 将 JSON POST 到 Akka Http 中的端点

haskell - 什么是 Haskell 中的组合器

haskell - 在 Clojure 中,有没有类似 Haskell 的 on 的功能?

scala - 理解偏函数中的 'case'关键字