gpt4 book ai didi

scala - Scala 类型 lambdas 是否会产生反射调用的成本?

转载 作者:行者123 更新时间:2023-12-01 09:52:30 24 4
gpt4 key购买 nike

我目前正在处理大量带有类型 lambda 的代码,并注意到 IntelliJ 警告我它是“高级语言功能:反射调用”。

示例代码:

implicit def monoidApplicative[M](M: Monoid[M]) =
new Applicative[({ type f[x] = Const[M, x] })#f] {
def unit[A](a: => A): M = M.zero
override def apply[A,B](m1: M)(m2: M): M = M.op(m1, m2)
}

注意:我认为这可能是 IntelliJ Scala 插件的一个错误,因为在编译时解析类型 lambda 是有意义的。

最佳答案

IDEA只是因为{ }而感到困惑堵塞。这些代码甚至在运行时都不存在。

这是一个小例子。具有一个类型参数的类型的通用标识方法:

def id[F[_], A](value: F[A]) = value

无法使用带有两个类型参数的类型调用此方法:
class Test[A, B]
id(new Test[Int, Int])

<console>:10: error: type mismatch;
found : Test[Int,Int]
required: F[A]
id(new Test[Int, Int])

但是我们可以使用类型 lambda 来定义一个函数 id2,它是根据 id 实现的:
def id2[F[_, _], A, B](value: F[A, B]) =
id[({ type f[x] = F[A, x] })#f, B](value)

id2(new Test[Int, Int])
res3: Test[Int,Int] = Test@1a53ac0c

相当复杂,但它有效。现在让我们看看字节码。
scala> :javap -c id2

...

public <F, A, B> F id2(F);
Code:
0: getstatic #19 // Field .MODULE$:L;
3: aload_1
4: invokevirtual #22 // Method .id:(Ljava/lang/Object;)Ljava/lang/Object;
7: areturn

...

正如您所看到的,所有类型的技巧都没有留下任何东西。没有反射(reflection),什么都没有。刚刚 java.lang.Object .

关于scala - Scala 类型 lambdas 是否会产生反射调用的成本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37134978/

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