评估咖喱功能

时间:2015-03-11 20:49:11

标签: scala

这个curried函数接受两个参数的函数,并将其转换为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>

此功能的一个好用例是什么?

1 个答案:

答案 0 :(得分:3)

一次只传递一个参数:

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)