scala之评估柯里化(Currying)函数
soundcode
阅读:15
2024-10-01 17:34:08
评论:0
这个柯里化(Currying)函数接受一个有两个参数的函数并将其转换为一个有 1 个参数的函数:
def hotcurry[A, B, C](f: (A, B) => C): A => (B => C) =
a => b => f(a, b) //> hotcurry: [A, B, C](f: (A, B) => C)A => (B => C)
def f(a : Int , b : Int) = a + b //> f: (a: Int, b: Int)Int
hotcurry(f) //> res0: Int => (Int => Int) = <function1>
如何返回函数res0: Int => (Int => Int) = <function1>
被评估?
我试过了 fu(2) //> res0: Int => Int = <function1>
此功能的良好用例是什么?
请您参考如下方法:
只需一次传递一个参数:
val g: Int => (Int => Int) = (a: Int) => (b: Int) => a + b
g(3)(4)
// res4: Int = 7
g
接受一个 Int
,并返回一个函数 Int => Int
。然后该函数接受一个 Int
并返回一个 Int
。因此,您将一个参数传递给第一个函数,然后将一个参数传递给返回的函数。
在您的情况下,只需执行以下操作:
val g = hotcurry(f)
g(3)(4)
如果你有一个双参数函数,你想稍后使用它作为一个参数函数,你可以使用它,提前打包一个参数。例如,map
有一个参数 Int => Int
,所以你可以这样做:
val add = hotcurry(f)
val add3 = add(3)
Vector(1, 2, 3).map(add3)
// Vector(4, 5, 6)
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。