gpt4 book ai didi

scala - 为什么 PartialFunction < : Function in Scala?

转载 作者:行者123 更新时间:2023-12-03 06:26:33 24 4
gpt4 key购买 nike

在 Scala 中,PartialFunction[A, B] 类派生自类型 Function[A, B](请参阅 Scala 引用,12.3.3)。然而,这对我来说似乎违反直觉,因为 Function (需要为所有 A 定义)比 PartialFunction 具有更严格的要求,在某些地方可能未定义。

我遇到的问题是,当我有部分函数时,我无法使用 Function 来扩展部分函数。例如。我做不到:

(pf orElse (_)=>"default")(x)

(希望语法至少是正确的)

为什么这个子类型是相反的?是否有任何我忽略的原因,例如 Function 类型是内置的?

顺便说一句,如果 Function1 :> Function0 也很好,所以我不需要在上面的示例中使用虚拟参数:-)

编辑以澄清子类型问题

通过查看两个示例可以强调两种方法之间的差异。哪一个是正确的?

一:

val zeroOne : PartialFunction[Float, Float] = { case 0 => 1 }
val sinc = zeroOne orElse ((x) => sin(x)/x) // should this be a breach of promise?

两个:

def foo(f : (Int)=>Int) {
print(f(1))
}
val bar = new PartialFunction[Int, Int] {
def apply(x : Int) = x/2
def isDefinedAt(x : Int) = x%2 == 0
}
foo(bar) // should this be a breach of promise?

最佳答案

因为在 Scala 中(与任何图灵完备语言一样),不能保证函数是完整的。

val f = {x : Int => 1 / x}

该函数未在 0 处定义。 PartialFunction 只是一个 promise 告诉您未定义位置的函数。尽管如此,Scala 仍然可以让您轻松地做您想做的事情

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

val pf : PartialFunction[Int, String] = {case 1 => "one"}

val g = pf orElse func2Partial{_ : Int => "default"}

scala> g(1)
res0: String = one

scala> g(2)
res1: String = default

如果您愿意,可以将 func2Partial 设为隐式。

关于scala - 为什么 PartialFunction < : Function in Scala?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/930698/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com