gpt4 book ai didi

scala - 类型类中的多个类型参数

转载 作者:行者123 更新时间:2023-12-05 00:55:31 25 4
gpt4 key购买 nike

我想使用类型类来设计转换接口(interface),代码如下:

case class Kilograms(value: Double)

case class Pounds(value: Double)

trait Convert[T, U] {
def convert(input: T): U
}

object Convert {
def apply[T:Convert, U:Convert] = implicitly[Convert[T,U]]
def covert[T, U](input: T)(implicit c: Convert[T, U]): U = c.convert(input)

implicit object kilogramsToPounds extends Convert[Kilograms, Pounds] {
override def convert(input: Kilograms): Pounds = Pounds(input.value * 2.20462)
}

implicit object poundsToKilograms extends Convert[Pounds, Kilograms] {
override def convert(input: Pounds): Kilograms = Kilograms(input.value / 2.20462)
}
}

但是编译错误:
Error: wrong number of type arguments for A$A95.this.Convert, should be 2
def apply[T:Convert, U:Convert] = implicitly[Convert[T,U]]

Error: could not find implicit value for parameter e: A$A95.this.Convert[T,U]
def apply[T:Convert, U:Convert] = implicitly[Convert[T,U]]

Error: not enough arguments for method implicitly: (implicit e: A$A95.this.Convert[T,U])A$A95.this.Convert[T,U].
Unspecified value parameter e.
def apply[T:Convert, U:Convert] = implicitly[Convert[T,U]]

如果我改变 def apply[T:Convert, U:Convert] = implicitly[Convert[T,U]]进入 def apply[T, U](implicit c: Convert[T, U]): Convert[T, U] = c ,没有编译错误!!!

我想知道发生了什么事?
另外,我查找了一些信息,上下文绑定(bind)受限于单一类型参数(?)
如果我想实现多类型参数类型类,我该怎么做?

最佳答案

上下文绑定(bind)语法 T : U仅适用于类型 U只有一个类型参数S (符合 T )。

这是有效的,因为您正在手动声明 Convert[T, U] 的隐式。 :

def covert[T, U](input: T)(implicit c: Convert[T, U]): U = c.convert(input)

以下内容无效,因为编译器将上下文边界脱糖为 Convert[T]Convert[U]分别,这是没有意义的。
 def apply[T:Convert, U:Convert] = implicitly[Convert[T,U]]

(尝试去糖)
 def apply[T, U](implicit ev1: Convert[T], ev2: Convert[U]) = ...

SLS 7.4 - Context and View Bounds :

A type parameter A of a method or non-trait class may also have one or more context bounds A : T. In this case the type parameter may be instantiated to any type S for which evidence exists at the instantiation point that S satisfies the bound T. Such evidence consists of an implicit value with type T[S].

关于scala - 类型类中的多个类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37981356/

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