【问题标题】:Creating A PartialFunction创建一个偏函数
【发布时间】:2017-10-27 22:33:22
【问题描述】:

我是一个绝对的 Scala 新手。因此,这个问题非常简单,希望有人能理解所问的内容。

在实验时,我发现我可以使用以下代码创建一个PartialFunction 实例:

val p : PartialFunction[Int, String] = {case x if x > 2 => s"x is ${x.toString}"}

我的问题:如何从函数{case x if x > 2 => s"x is ${x.toString}"} 创建一个具体的PartialFunction[Int, String]?

特别是,这个功能是如何提供两者的..

  • isDefinedAt(x: Int): Boolean方法定义

..还有..

  • apply(v1: Int): String方法定义

..一个具体的 PartialFunction[Int, String] 必须有?

在幕后,{case x if x > 2 => s"x is ${x.toString}"} 被变成了?:

val p : PartialFunction[Int, String] = new PartialFunction[Int, String] {
  override def apply(v1: Int): String = {
    v1 match {
      case x if x > 2 => s"x is ${x.toString}"
    }
  }

  override def isDefinedAt(x: Int): Boolean = {
    x match {
      case x if x > 2 => true
      case _ => false
    }
  }
}

【问题讨论】:

标签: scala


【解决方案1】:

权威答案可见the Scala language specification

8.5 模式匹配匿名函数

一个匿名函数可以由一系列案例定义

{ case p1 => b1 … case pn => bn }

显示为没有事先匹配的表达式。这种表达式的预期类型必须部分定义。对于某些 k > 0,它必须是 scala.Functionk[S1,…,Sk, R]scala.PartialFunction[S1, R],其中参数类型 S1,…,Sk 必须完全确定,但结果类型 R 可能未确定。

...

如果预期的类型是scala.PartialFunction[S, R],则该表达式被视为等价于以下实例创建表达式:

new scala.PartialFunction[S, T] {
  def apply(x: S): T = x match {
    case p1 => b1 … case pn => bn
  }
  def isDefinedAt(x: S): Boolean = {
    case p1 => true … case pn => true
    case _ => false
  }
}

这里,x 是一个新名称,T 是所有 bi 类型中的弱最小上限。如果p1,…,pn 模式之一已经是变量或通配符模式,则省略isDefinedAt 方法中的最后一个默认情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多