gpt4 book ai didi

scala - 这是scala专门的错误吗?

转载 作者:行者123 更新时间:2023-12-04 18:59:51 24 4
gpt4 key购买 nike

以下代码编译失败,但如果我删除 specialized 则通过方法中的注释 dot .

Scala 代码运行器版本 2.12.0-RC2 -- 版权所有 2002-2016,LAMP/EPFL 和 Lightbend, Inc.

abstract class Op[@specialized Left, @specialized Right] {
@specialized
type Result

def r: Numeric[Result]
def times(left: Left, right: Right): Result
}


object Op {

implicit object IntDoubleOp extends Op[Int, Double] {
type Result = Double
val r = implicitly[Numeric[Double]]
def times(left: Int, right: Double): Double = left * right
}
}


object calc {

def dot[@specialized Left, @specialized Right](xs: Array[Left], ys: Array[Right])
(implicit op: Op[Left, Right]): op.Result = {
var total = op.r.zero
var index = xs.length
while(index > 0) {
index -= 1
total = op.r.plus(total, op.times(xs(index), ys(index)))
}
total
}
}
test.scala:31: error: type mismatch;
found : op.Result
required: op.Result
total
^
one error found

这是另一个没有运气的尝试:
//cat Ops.scala 
import scala.{ specialized => sp }

trait OpsResult {
type N
}

trait SymOps extends OpsResult {
@sp override type N
def zero: N
def plus(left: N, right: N): N
}

trait AsyOps[@sp L, @sp R] extends OpsResult {
@sp override type N
def times(left: L, right: R): N
}

trait MixOps[@sp L, @sp R] extends AsyOps[L, R] with SymOps

object MixOps {
trait DoubleOps extends SymOps {
override type N = Double
def zero: Double = 0.0
override def plus(left: Double, right: Double): Double = left + right
}
trait IntDoubleOps extends AsyOps[Int, Double] {
override type N = Double
override def times(left: Int, right: Double): Double = left * right
}

implicit object MixIntDouble extends IntDoubleOps with DoubleOps
}

object Test {
def dot[@sp L, @sp R](xs: Array[L], ys: Array[R])
(implicit op: MixOps[L, R]): op.N = {
op.zero
}
}
$ scalac Ops.scala 
Ops.scala:36: error: type mismatch;
found : op.N
required: op.N
op.zero
^
one error found

最佳答案

这是一个错误(也在 2.11.x 上重现)。我已经联系了 LightBend 的人,这绝对是专门化和路径依赖类型的代码生成的一个怪癖。我把它缩小到一个 slim 的复制:

trait M[@specialized T] {
type Res
def res: Res
}

object Test {
def m[@specialized T](op: M[T]): op.Res = op.res
}
op 的符号将不同步并且不会像您在代码中看到的那样编译。 @AdriaanMoors has opened a bug关于这个问题。

Adriaan 还向我指出了 this blog post作者 Aleksandar Prokopec 指出了 @specilization 中的一些怪癖代码生成。

关于scala - 这是scala专门的错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40214215/

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