gpt4 book ai didi

scala - 为什么隐式搜索会受到不相关类型参数的影响?

转载 作者:行者123 更新时间:2023-12-02 20:11:32 25 4
gpt4 key购买 nike

考虑 Scala 中一些测量单位功能的简化片段:

object UnitsEx {
case class Quantity[M <: MInt, T: Numeric](value: T) {
private val num = implicitly[Numeric[T]]
def *[M2 <: MInt](m: Quantity[M2, T]) =
Quantity[M, T](num.times(value, m.value))
}

implicit def measure[T: Numeric](v: T): Quantity[_0, T] = Quantity[_0, T](v)
implicit def numericToQuantity[T: Numeric](v: T): QuantityConstructor[T] =
new QuantityConstructor[T](v)

class QuantityConstructor[T: Numeric](v: T) {
def m = Quantity[_1, T](v)
}

sealed trait MInt
final class _0 extends MInt
final class _1 extends MInt
}

此片段显示了我当前遇到的用法和编译器错误:

import UnitsEx._

(1 m) * 1 // Works
1 * (1 m) // Doesn't work:
/*
<console>:1: error: overloaded method value * with alternatives:
(x: Double)Double <and>
(x: Float)Float <and>
(x: Long)Long <and>
(x: Int)Int <and>
(x: Char)Int <and>
(x: Short)Int <and>
(x: Byte)Int
cannot be applied to (UnitsEx.Quantity[UnitsEx._1,Int])
1 * (1 m)
^
*/

measure 包装 1 可以解决问题,但为什么不应用隐式范围?

如果我像下一个代码片段一样删除类型参数M,它就会开始工作,尽管我看不到该类型参数与隐式搜索有何关系:

object UnitsEx2 {   
case class Quantity[T: Numeric](value: T) {
private val num = implicitly[Numeric[T]]
def *(m: Quantity[T]) = Quantity[T](num.times(value, m.value))
}

implicit def measure[T: Numeric](v: T): Quantity[T] = Quantity[T](v)
implicit def numericToQuantity[T: Numeric](v: T): QuantityConstructor[T] =
new QuantityConstructor[T](v)

class QuantityConstructor[T: Numeric](v: T) {
def m = Quantity[T](v)
}
}

这是类型检查器的预期限制还是已知的限制?

最佳答案

如果将 * 运算符重命名为,例如mult1 mult (1 m) 在这两种情况下都有效。这并没有回答您的问题,但确实暗示了可能对重载的 * 运算符存在一些干扰。

关于scala - 为什么隐式搜索会受到不相关类型参数的影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9150537/

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