我想做以下几件事:
val divide: PartialFunction[(Int, Int), Int] = {
case (x, y) if (y != 0) => x / y
}
val divide42 = (y: Int) => divide((42, y))然而:
divide42.isDefinedAt(0)cmd18.sc:1: value isDefinedAt is not a member of Int => Int
val res18 = divide42.isDefinedAt(0)
^Compilation Failed在从PartialFunction转到部分应用函数时,保留PartialFunction功能的正确方法是什么?
发布于 2022-04-24 07:17:37
您可以使用compose来保留部分性质:
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您所写的内容不起作用,因为它实际上是用于下列方面的语法糖:
val divide42 = new Function1[Int, Int] {
def apply(y: Int) = divide((42, y))
}调用divide is divide42是一个计算为Int (或抛出)的表达式。没有办法保留divide是具有此语法的部分函数这一事实。
或者像这样显式地编写一个新的部分函数,但是更详细:
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发布于 2022-04-24 17:44:21
帮助编译器帮助您,显式定义您的类型:
编辑:我意识到,仅仅改变类型就会导致函数的y != 0部分无法按预期工作。正如在另一个答案中已经提到的那样,compose解决了这个问题(这是正确的)。
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]。
// Implicit type, `Int => Int`
val divide42 = (y: Int) => divide((42, y))
// `isDefinedAt` is not defined for `Int => Int`
divide42.isDefinedAt(0) // !! Error !!发布于 2022-04-24 18:34:32
在我看来,以下几点是正确的:
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的正确定义模式,又适合于部分应用函数的定义。
https://stackoverflow.com/questions/71986191
复制相似问题