Scala 总函数作为部分函数



由于总函数是部分函数的特例,我想当我需要部分函数时,我应该能够返回一个函数。

例如,

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

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

我知道我可以做到以下几点,但这只是一个出于好奇的问题

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

您可以使用PartialFunction.apply方法:

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

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

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

FunctionN不是总函数:

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

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

完全摆脱PartialFunction并在函数文字和提升方法的FunctionN级别isDefinedAt true实现isDefinedAt可能是有意义的。

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

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

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

反之亦然 - 您可以使用需要超类的子类。因此,您可以从键入以返回Function1(具有相同类型参数)的方法返回PartialFunction

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) }

时间已经过去,Scala 在 2.13.5 并且自 Scala 2.12.5 以来已弃用接受答案中显示的内容:

要将普通函数 f 转换为偏函数 pf,请使用 val pf: PartialFunction[A, B] = { case x => f(x) } 。要创建新的分部函数,请改用显式类型注释,如 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

我认为您正在寻找称为"lift"的便捷方法,它将部分函数转换为函数1(返回包装在选项中的结果)。

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

说到分类法;我想你倒过来了 - 部分函数是函数的子类型1

相关内容

  • 没有找到相关文章

最新更新