首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >部分应用函数的PartialFunction

部分应用函数的PartialFunction
EN

Stack Overflow用户
提问于 2022-04-24 07:00:44
回答 3查看 64关注 0票数 1

我想做以下几件事:

代码语言:javascript
复制
val divide: PartialFunction[(Int, Int), Int] = {
    case (x, y) if (y != 0) => x / y
}

val divide42 = (y: Int) => divide((42, y))

然而:

代码语言:javascript
复制
divide42.isDefinedAt(0)

代码语言:javascript
复制
cmd18.sc:1: value isDefinedAt is not a member of Int => Int
val res18 = divide42.isDefinedAt(0)
                     ^Compilation Failed

在从PartialFunction转到部分应用函数时,保留PartialFunction功能的正确方法是什么?

EN

回答 3

Stack Overflow用户

发布于 2022-04-24 07:17:37

您可以使用compose来保留部分性质:

代码语言:javascript
复制
val divide: PartialFunction[(Int, Int), Int] = {
    case (x, y) if (y != 0) => x / y
}

val divide42: PartialFunction[Int, Int] = divide.compose {
  case y: Int => (42, y)  
}

divide42.isDefinedAt(0) // false

您所写的内容不起作用,因为它实际上是用于下列方面的语法糖:

代码语言:javascript
复制
val divide42 = new Function1[Int, Int] {
  def apply(y: Int) = divide((42, y))
}

调用divide is divide42是一个计算为Int (或抛出)的表达式。没有办法保留divide是具有此语法的部分函数这一事实。

或者像这样显式地编写一个新的部分函数,但是更详细:

代码语言:javascript
复制
val divide: PartialFunction[(Int, Int), Int] = {
    case (x, y) if (y != 0) => x / y
}

val divide42: PartialFunction[Int, Int] = {
  case (y: Int) if divide.isDefinedAt((42, y)) => divide((42, y)) 
}

divide42.isDefinedAt(0) // false
票数 4
EN

Stack Overflow用户

发布于 2022-04-24 17:44:21

帮助编译器帮助您,显式定义您的类型:

编辑:我意识到,仅仅改变类型就会导致函数的y != 0部分无法按预期工作。正如在另一个答案中已经提到的那样,compose解决了这个问题(这是正确的)。

代码语言:javascript
复制
val divide: PartialFunction[(Int, Int), Int] = {
    case (x, y) if y != 0 => x / y
}


// OLD: val divide42: PartialFunction[Int, Int] = (y: Int) => divide((42, y))
// |- Returns true for `isDefinedAt(0)` which is WRONG!!
// |- If someone could explain why this happens (???), please comment :)

val divide42: PartialFunction[Int, Int] = (y: Int) => divide.compose {
    case y: Int => (42, y)
}

divide42.isDefinedAt(0) // False

定义它时,编译器会将divide42的类型更改为Int => Int,而不是PartialFunction[Int, Int]

代码语言:javascript
复制
// Implicit type, `Int => Int`
val divide42 = (y: Int) => divide((42, y))

// `isDefinedAt` is not defined for `Int => Int`
divide42.isDefinedAt(0) // !! Error !!
票数 0
EN

Stack Overflow用户

发布于 2022-04-24 18:34:32

在我看来,以下几点是正确的:

代码语言:javascript
复制
val divide: PartialFunction[(Int, Int), Int] = {
    case (x, y) if (y != 0) => x / y
}

val divide42: PartialFunction[Int, Int] = {
    case x if (x != 0) => divide(42, x)
}

divide42.isDefinedAt(0) // false

divide42(6) // 7

这既符合PartialFunction的正确定义模式,又适合于部分应用函数的定义。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71986191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档