我是scala的新手,我在理解currying时遇到了一些麻烦 - 我现在正在练习编写简单的函数,并且需要澄清以下内容
def mul (a: Int) (b: Int): Int =
{
{
a * b
}
}
以上功能定义是否与下面相同?
def mul: Int => Int => Int = {
(a: Int) =>
{
(b: Int) =>
a * b
}
}
从语法中我可以将mul
解释为接受整数的函数,并返回一个接受整数并返回整数的函数。但我不确定我的解释是否真的正确。有关上述示例或curried函数语法的任何解释都非常有用。
答案 0 :(得分:10)
您的解释是正确的。但你不需要所有这些支撑。
def mul(a: Int)(b: Int) = a*b
val mulAB = (a: Int) => { (b: Int) => a*b } // Same as mul _
val mul5B = (b: Int) => 5*b // Same as mulAb(5) or mul(5) _
通常,您可以将具有多个参数的任何函数重写为curried链,其中每个参数生成一个函数,该函数在最后一个参数实际生成值之前需要少一个参数:
f(a: A ,b: B ,c: C, d: D): E <===> A => B => C => D => E
在Scala中,自然分组是参数块,而不是单个参数,所以
f(a: A)(b: B, c: C)(d: D): E <===> A => (B,C) => D => E