gpt4 book ai didi

scala - Scala 中的柯里化(Currying)与匿名函数

转载 作者:行者123 更新时间:2023-12-04 23:15:57 26 4
gpt4 key购买 nike

我在比较定义 higher-order function 的两种方法在斯卡拉:

def f1(elem: Int)(other: Int) = (elem == other)

def f2(elem: Int) = (other: Int) => (elem == other)

第一个使用 currying而第二个使用 anonymous function .

我想知道这两种方法在 Scala 如何实现它们以及哪个版本更可取方面有什么区别(如果有的话)?

最佳答案

实现与 Scala 编译器完全不同。 curried 版本通过取消参数化来编译成 Java 方法:

def f1(elem: Int, other: Int): Boolean = elem.==(other);

第二个版本是一个返回匿名函数的方法(一个 Function1 ),所以它们的签名完全不同。尽管它们通常可以在 Scala 代码中互换使用,但在第二个版本中生成的代码要多得多:
  def f2(elem: Int): Function1 = (new <$anon: Function1>(elem): Function1);

@SerialVersionUID(value = 0) final <synthetic> class anonfun$f2$1 extends scala.runtime.AbstractFunction1$mcZI$sp with Serializable {
final def apply(other: Int): Boolean = anonfun$f2$1.this.apply$mcZI$sp(other);
<specialized> def apply$mcZI$sp(other: Int): Boolean = anonfun$f2$1.this.elem$1.==(other);
final <bridge> <artifact> def apply(v1: Object): Object = scala.Boolean.box(anonfun$f2$1.this.apply(scala.Int.unbox(v1)));
<synthetic> <paramaccessor> private[this] val elem$1: Int = _;
def <init>(elem$1: Int): <$anon: Function1> = {
anonfun$f2$1.this.elem$1 = elem$1;
anonfun$f2$1.super.<init>();
()
}
}

我只会在明确希望使用 Function1 的情况下考虑使用第二个版本。对象。但是,我个人倾向于使用 curried 版本,因为您仍然可以获得 Function1回与第一个部分应用。 curried 版本同样强大,但不会创建 Function1当你不需要它们时。
scala> f1(1) _
res1: Int => Boolean = <function1>

关于scala - Scala 中的柯里化(Currying)与匿名函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42180312/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com