Scala总函数作为部分函数

时间:2014-01-02 20:08:10

标签: scala partial-functions

由于总函数是部分函数的特例,我认为我应该能够在需要部分函数时返回函数。

例如,

def partial : PartialFunction[Any,Any] = any => any

当然这种语法无法编译。我的问题是,是否可以这样做,如果是这样,我需要做什么才能使语法正确。

我知道我可以做到以下几点,但这只是一个非常奇怪的问题

def partial : PartialFunction[Any,Any] = {
  case any => any
}

5 个答案:

答案 0 :(得分:12)

您可以使用PartialFunction.apply方法:

val partial = PartialFunction[Any,Any]{ any => any }

如果您想缩短此方法,可以导入此方法:

import PartialFunction.{apply => pf}
val partial = pf[Any,Any]{ any => any }

答案 1 :(得分:4)

FunctionN 总函数:

val evilFun: Int => Int = n => if (n < 0) sys.error("I'm evil!") else n

换句话说,所有Scala函数都是部分函数。因此,PartialFunction只是为您提供了一种方法,可以通过isDefinedAt检查部分功能,并通过orElse检查链部分功能。

完全摆脱PartialFunction并在isDefinedAt级别使用函数文字并且提升方法一如既往地实现FunctionN {{1} }}

答案 2 :(得分:1)

我想你可能已经改变了这个概念。

PartialFunction[-A, +B] extends (A) ⇒ B 

但是,您不能使用期望子类的超类值,因为子类更具体。因此,您无法从键入的方法返回Function1值以返回PartialFunction

反过来有效 - you can use a subclass where a superclass is expected。因此,您可以从键入的方法返回PartialFunction以返回Function1(具有相同的类型参数):

scala> def f: Any => Any = { case a => "foo" }
f: Any => Any

scala> f(1)
res0: Any = foo

在这种特殊情况下,您始终可以将Function转换为PartialFunction,因此会提供PartialFunction.apply方法。

def apply[A, B](f: A => B): PartialFunction[A, B] = { case x => f(x) }

答案 3 :(得分:0)

时间在向前推进,Scala 处于 2.13.5,而 accepted answer 中显示的内容自 Scala 2.12.5 起已弃用:

<块引用>

要将普通函数 f 转换为偏函数 pf,请使用 val pf: PartialFunction[A, B] = { case x => f(x) }。要创建新的 PartialFunction,请改用显式类型注释,例如 val pf: PartialFunction[Int, String] = { case 1 => "one" }

此外,请考虑 import scala.{PartialFunction => =/>}(与常规函数 => 相比)。由于部分函数需要写出类型(也就是添加类型注释),这为您节省了大量手动输入并提高了可读性,例如:

val yourPf: String =/> String = {
  case SomeRegEx(s) => s
}

旁注:在我的机器上 PartialFunction.apply 甚至导致错误 PartialFunction.type does not take parameters

答案 4 :(得分:-4)

我认为你正在寻找一种名为&#34; lift&#34;它将部分函数转换为function1(返回包含在选项中的结果)。

http://www.scala-lang.org/api/current/index.html#scala.PartialFunction

谈到分类学;我认为你得到了倒退 - 部分功能是function1

的子类型