def curry[A,B,C](f: (A, B) => C): A => (B => C) =
(a: A) => f(a, _)
def curry[A,B,C](f: (A, B) => C): A => (B => C) =
(a: A) => (b: B) => f(a, b)
我在想的是,在第一个实现中,我将使用函数f并传入A和任何东西(但编译器将键入检查第二个参数是否为B)以获得C out。
答案 0 :(得分:2)
是的,它们完全相同。如果你编译:
object Test {
def curry[A,B,C](f: (A, B) => C): A => (B => C) =
(a: A) => f(a, _)
def curry2[A,B,C](f: (A, B) => C): A => (B => C) =
(a: A) => (b: B) => f(a, b)
}
使用-Xprint:typer
,您将获得中间抽象语法树:
[[syntax trees at end of typer]]
package <empty> {
object Test extends scala.AnyRef {
def <init>(): Test.type = {
Test.super.<init>();
()
};
def curry[A, B, C](f: (A, B) => C): A => (B => C) = ((a: A) => ((x$1: B) => f.apply(a, x$1)));
def curry2[A, B, C](f: (A, B) => C): A => (B => C) = ((a: A) => ((b: B) => f.apply(a, b)))
}
}
在&#34; typer&#34;阶段,当编译器为所有内容分配类型时,它会意识到_
(现在名为x$1
)必须是B
类型。