Ama*_*asu 0 functional-programming scala
如果我们将其限制为三个参数的情况,我想从中得到
val f = (x: Int, y: Int, z: Int) => x + y + z
Run Code Online (Sandbox Code Playgroud)
对此:
val g = (x: Int) => { (y: Int, z: Int) => f(x, y, z) }
Run Code Online (Sandbox Code Playgroud)
我什至不知道该操作是如何调用的,大概是“柯里化第一个参数”?
Scala 是否有用于此操作的实用函数,或者像上面那样写出来是实现它的唯一方法吗?
开箱即用,只有.curried
一个柯里化所有参数:
val f = (x: Int, y: Int, z: Int) => x + y + z
f.curried // Int => Int => Int => Int
Run Code Online (Sandbox Code Playgroud)
但是,您可以使用_
语法使代码稍微短一些:
(x: Int) => f(x, _, _) // Int => (Int, Int) => Int
Run Code Online (Sandbox Code Playgroud)
如果确实需要经常使用,可以自己实现一些扩展方法
// Scala 2
implicit class Function3CurryFirstOps[A, B, C, D](private val f: (A, B, C) => D) extends AnyVal {
def curriedFirst: A => (B => C) => D = (a: A) => f(a, _, _)
}
// Scala 3
extension [A, B, C, D](f: (A, B, C) => D)
def curriedFirst: A => (B => C) => D = (a: A) => f(a, _, _)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
49 次 |
最近记录: |