- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习Scala,从scala doc中找到PartialFunction和Function1的定义,如下所示:
trait PartialFunction[-A, +B] extends (A) ⇒ B
trait Function1[-T1, +R] extends AnyRef
Q1) 我的第一个问题是:(A) => B 的类型是什么?
而且,我知道我们可以通过 lift 方法将 PartialFunction 变成一个普通函数。
但是问题 2)ParitialFunction 和 Function1 之间的关系是什么?
似乎如果某些函数参数是 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 ⇒ B
是 Function1[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/
这有效: scala> List(1, "aa") collect { case n : Int => n+2 } res52: List[Int] = List(3) 这很好用: scala> v
PartialFunction 是一个天然的提取器,它的 lift 方法提供了精确的提取器功能。所以使用部分函数作为提取器会非常方便。这将允许以比可用于 PartialFunction 的普通 orE
这是我想了一段时间的事情。我经常看到这种模式: if (pf.isDefinedAt(in)) pf(in) 通过将其分解为两个单独的调用,所有在#isDefinedAt 中求值的模式也将在#appl
让我们定义一个 PartialFunction[String, String]和一个 PartialFunction[Any, String] 现在,给定 orElse 的定义 def orElse[
如何拦截 PartialFunction?例如在 Actor 中,如果我只想打印进入以下接收方法的所有内容,然后再将其传递给流程方法: class MyActor extends Actor {
我有一个名为 errorMap 的 PartialFuncton[Throwable,Future[Result]] 将 throwable 转换为结果或失败的 future 。我可以像这样通过 li
定义 PF 有两种方式: 1) 使用文字 case {}语法和 2) 作为显式类。我需要以下函数抛出一个 MatchError,但在第二种情况下不会发生。 1) 带外壳 val test: Parti
所以,假设我想为 PartialFunction 提供一个“包罗万象”的回退: val foo: PartialFunction[Int, String] = { case 1 => "foo" }
我不认为这段代码应该有效,但它确实有效(在 Scala 2.10 中): scala> ((i: Int) => i.toString match { | case s
我之前问过这个问题:Combine a PartialFunction with a regular function 然后意识到,我实际上并没有问对。 所以,这是另一个尝试。 如果我这样做: va
我正在学习Scala,从scala doc中找到PartialFunction和Function1的定义,如下所示: trait PartialFunction[-A, +B] extends (A)
偏函数 在 Scala 中,一个 PartialFunction 简而言之,是一个额外定义了一个 isDefinedAt 的函数方法。 用一系列 case 很容易定义偏函数陈述。一个简单的例子是,例如
我以为PartialFunction可以 Monoid .我的思维过程正确吗? 例如, import scalaz._ import scala.{PartialFunction => -->} im
在 Scala 中,PartialFunction[A, B] 类派生自类型 Function[A, B](请参阅 Scala 引用,12.3.3)。然而,这对我来说似乎违反直觉,因为 Functio
我对 scala 编译器允许编译这个相当奇怪、明显错误的代码这一事实感到有点失望: val foo: PartialFunction[Any, Unit] = { case s: String =
Scala API 中没有内置函数可以将 PartialFunction 提升为 Either。 这是我的版本: def liftToEither[A, B, C](pf: PartialFunc
在 scala 中,Futures 有一种采用 PartialFunction 的救援函数。如果 Future 通过响应解决,则跳过此代码,但如果发生故障,则会调用此代码。 我想简单地将部分函数包装在
我定义了 PartialFunction 的 2 个版本在斯卡拉。 val doubleEvens1: PartialFunction[Int, Int] = { case x if x
当第一个函数具有 case _ => 通配符模式时,是否有可能 orElse 组成两个 PartialFunction 匹配因此有效的任何内容是一个总函数。 例如给定 val pf1: Partial
我正在尝试将部分函数传递给通过滑动窗口在 DStream 批处理中捕获的所有 RDD 的并集。假设我在离散为 1 秒批处理的流上构造了一个超过 10 秒的窗口操作: val ssc = new Str
我是一名优秀的程序员,十分优秀!