gpt4 book ai didi

scala - PartialFunction 和 Function1 有什么关系

转载 作者:行者123 更新时间:2023-12-05 04:09:24 24 4
gpt4 key购买 nike

我正在学习Scala,从scala doc中找到PartialFunctionFunction1的定义,如下所示:

trait PartialFunction[-A, +B] extends (A) ⇒ B
trait Function1[-T1, +R] extends AnyRef

Q1) 我的第一个问题是:(A) => B 的类型是什么?

而且,我知道我们可以通过 lift 方法将 PartialFunction 变成一个普通函数。

但是问题 2)ParitialFunctionFunction1 之间的关系是什么?

似乎如果某些函数参数是 Function1 类型,我们可以将匹配的 PartitionFunction 传递给它,如下所示:

scala> val process = (f: Function1[String, Int]) => f("1024")
process: (String => Int) => Int = <function1>

scala> val pattern = "([0-9]+)".r
pattern: scala.util.matching.Regex = ([0-9]+)

scala> val str2int: PartialFunction[String, Int] = {
| case pattern(num) => num.toInt
| }
str2int: PartialFunction[String,Int] = <function1>

scala> accept(str2int)
res67: Int = 1024

谢谢!

最佳答案

A ⇒ BFunction1[A, B] 的语法糖。同样,(A1, A2) ⇒ R 实际上是 Function2[A1, A2, R] 等等,一直到 22(完全任意限制)。 PartialFunction 的定义是这样的

trait PartialFunction[-A, +B] extends Function1[A, B]

由于 PartialFunction[A, B] 也是 Function1[A, B],您可以将它传递给需要 A ⇒ B 的对象。我们使用 而不是 FunctionN 的唯一原因是审美:它看起来更好。实际上,由于 并不是真正的类型名称,我们不能这样说:

type ApIntInt[T[_, _]] = T[Int, Int]
// ApIntInt[⇒] // Error: ⇒ is not a type and was not expected here
ApIntInt[Function1] // Fine: Function1 is a type, it has the right kind, so it works.
// ApIntInt[Function1] = Function1[Int, Int] = Int ⇒ Int

由于您是初学者,很长一段时间内您不会看到这种东西(高级种类),但是它就在那里,并且您可能有一天会遇到它。

当您将 PartialFunction 用作 Function1 时,如果您传递一个未定义的值,它(可能)会抛出异常,这通常是MatchError(但不一定是)。相比之下,如果您调用 pf.lift,它会创建一个 Function[In, Option[Out]],它会返回 Some(result)如果在某个点定义了 PartialFunction,如果不是,则根据 Scaladoc 返回 None

例如:

lazy val factorial: PartialFunction[Int, Int] = {
case num if num > 1 => num * factorial(num - 1)
case 1 => 1
}
assert(!factorial.isDefinedAt(0))
factorial.apply(0) // Using a PF as a Function1 on an undefined point breaks (here with MatchError)
factorial.lift.apply(0) // This just returns None, because it checks isDefinedAt first

关于scala - PartialFunction 和 Function1 有什么关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46029526/

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