部分函数类型

发布于 2024-11-04 02:50:26 字数 588 浏览 0 评论 0原文

在scala play框架中我看到了这段代码:

abstract class AnalyserInfo
case class ColumnC(typeName:String,fieldName:String) extends AnalyserInfo
case class TableC(typeName:String) extends AnalyserInfo

    val asIs :PartialFunction[AnalyserInfo,String] = {
      case ColumnC(_,f) => f;
      case TableC(typeName) => typeName
    }

与以下内容有什么区别:

val asIs: (AnaliserInfo)=>String = (info) => info match {
  case ColumnC(_,f) => f;
  case TableC(typeName) => typeName
}

有首选风格?为什么在第一种情况下可以省略 match 关键字?

感谢您的支持。

in scala play framework I seen this code:

abstract class AnalyserInfo
case class ColumnC(typeName:String,fieldName:String) extends AnalyserInfo
case class TableC(typeName:String) extends AnalyserInfo

    val asIs :PartialFunction[AnalyserInfo,String] = {
      case ColumnC(_,f) => f;
      case TableC(typeName) => typeName
    }

What is the difference with:

val asIs: (AnaliserInfo)=>String = (info) => info match {
  case ColumnC(_,f) => f;
  case TableC(typeName) => typeName
}

There is a preferred style? and why in the first case the match keyword can be omitted?

Thank you for the support.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

雅心素梦 2024-11-11 02:50:26

双=> Double 只是 Function[Double, Double] 的简写。 PartialFunction 继承自 Function 但添加了一些方法。最重要的是,它添加了 isDefinedAt 方法,该方法允许您查询是否为某些参数定义了该函数。

不匹配的 case 是定义部分函数的特殊语法,它会生成一个 isDefinedAt,为所有匹配的 case 返回 true

假设我们有一个返回 1/x 的函数,但仅对于 x 的正值,我们可以将其定义为:

scala> val f: (Double => Double) = { case x if x > 0 => 1/x }             
f: (Double) => Double = <function1>

或:

scala> val g: PartialFunction[Double, Double] = { case x if x > 0 => 1/x }
g: PartialFunction[Double,Double] = <function1>

第二个版本的好处是我们可以检查该函数是否适用于某些参数:

scala> g.isDefinedAt(-3)
res0: Boolean = false

此功能是例如,在 Scala 中用于实现 Actor 库,其中 Actor 可能仅使用某些类型的消息。

Double => Double is just a shorthand for Function[Double, Double]. PartialFunction inherits from Function but adds a few methods. Most importantly, it adds the method isDefinedAt which allows you to query if the function is defined for some parameter.

The cases without a match are a special syntax to define partial functions, which generates an isDefinedAt that returns true for all matching cases.

Say we have a function that returns 1/x, but only for positive values of x, we could it define as:

scala> val f: (Double => Double) = { case x if x > 0 => 1/x }             
f: (Double) => Double = <function1>

or as:

scala> val g: PartialFunction[Double, Double] = { case x if x > 0 => 1/x }
g: PartialFunction[Double,Double] = <function1>

The second version has the benefit that we could check if the function is applicable to some parameter:

scala> g.isDefinedAt(-3)
res0: Boolean = false

This feature is for example used in Scala to implement the actor library where an Actor might only consume certain types of messages.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文