这两种咖喱功能实现是否相同?

时间:2014-07-08 21:35:35

标签: scala currying

  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。

1 个答案:

答案 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类型。