gpt4 book ai didi

scala - 在 Scala 中为类型类隐式使用参数类型

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

我想在 Scala 中学习更多关于 TypeClasses 的知识,并想出了这个例子

trait Cons[T] {
def cons(t1: T, t2: T):T
}

object Cons {
implicit object StringCons extends Cons[String] {
override def cons(t1: String, t2: String): String = t1 + t2
}

implicit object ListCons extends Cons[List[_]] {
override def cons(t1: List[_], t2: List[_]): List[_] = t1 ++ t2
}

implicit object IntCons extends Cons[Int] {
override def cons(t1: Int, t2: Int): Int = Integer.parseInt(t1.toString + t2.toString)
}
}

def Cons[T](t1: T, t2: T)(implicit c: Cons[T]):T = {
c.cons(t1, t2)
}

Cons("abc", "def") // abcdef
Cons(1, 2) // 12
Cons(List(1,2,3),List(4,5,6)) // does not work, as the expected type is List[Int]

当我创建 ListCons 时,我明确设置了 List[_] 的类型,如果我理解正确的话,它是存在类型并且是相当于 Java 通配符,这意味着它是某种类型,我们不关心。

现在的问题是为什么这不起作用。有没有办法让它工作。或者我可能存在一些根本性的误解。

最佳答案

Cons(List(1,2,3),List(4,5,6)) 不起作用的原因是因为根据类型推断规则,它意味着 Cons[List [Int]](List[Int](1,2,3), List[Int](4,5,6)),所以它特别需要一个隐式的 Cons[List[Int]] Cons[List[_]] 不是 Cons[List[Int]]

Cons[List[_]] 是一个Cons[List[Int]] if Cons是逆变的(声明为 Cons[-T]),但它不能是逆变的,因为它有一个返回 T 的方法(除非你用 @uncheckedVariance 作弊,你不应该)。

让它工作的正确方法是用

替换 ListCons
implicit def listCons[T]: Cons[List[T]] = new Cons[List[T]] {
override def cons(t1: List[T], t2: List[T]): List[T] = t1 ++ t2
}

关于scala - 在 Scala 中为类型类隐式使用参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39030698/

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