gpt4 book ai didi

带有类型参数的 Scala 列表

转载 作者:行者123 更新时间:2023-12-01 10:22:10 25 4
gpt4 key购买 nike

我在编写一个名为 head 的函数时遇到了问题,该函数基本上将 head 元素替换为调用它的 List 的另一个元素:

List(1,2,3,4).head(4) // List(4,2,3,4)

代码显然是无用的,我只是想和 Scala 玩得开心。这是代码:

sealed trait List[+A]{
def tail():List[A]
def head[A](x:A):List[A]
}

object Nil extends List[Nothing]{
def tail() = throw new Exception("Nil couldn't has tail")
def head[A](x:A): List[A] = List(x)
}

case class Cons[+A](x :A, xs: List[A]) extends List[A]{
def tail():List[A] = xs
def head[A](a:A): List[A] = Cons(a,xs)
}

object List{
def apply[A](as:A*):List[A] = {
if (as.isEmpty) Nil
else Cons(as.head,apply(as.tail: _*))
}
}

Cons(1,Cons(2,Nil)) == List(1,2)
Cons(1,Cons(2,Cons(3,Cons(4,Nil)))).tail()
List(1,2,3,4,5,6,7).tail()
List(1,2,3,4).head(4)

它没有编译,我有这个错误:

Error:(11, 39) type mismatch;
found : A$A318.this.List[A(in class Cons)]
required: A$A318.this.List[A(in method head)]
def head[A](a:A): List[A] = Cons(a,xs)

你能解释一下为什么吗?

问候。

最佳答案

您的问题是您的 head 方法采用另一种类型 A,因此在该范围内,编译器将这些 A 视为不同的,即,特征中定义的 Ahead[A] 中的 A 覆盖。

此外,您的 head 方法在逆变位置采用 A 类型的协变元素,因此您不能将 head 定义为这样的。

您可以将head 定义为:

def head[B >: A](x: B): List[B]

因此,你得到:

object S {
sealed trait List[+A] {
def tail(): List[A]
def head[B >: A](x: B): List[B]
}

case object Nil extends List[Nothing] {
def tail() = throw new Exception("Nil doesn't have a tail")
def head[B >: Nothing](x: B): List[B] = Cons(x, Nil)
}

case class Cons[+A](x: A, xs: List[A]) extends List[A] {
def tail(): List[A] = xs
def head[B >: A](a: B): List[B] = Cons(a, xs)
}

object List {
def apply[A](as: A*): List[A] = {
if (as.isEmpty) Nil
else Cons(as.head, apply(as.tail: _*))
}
}
}

在 REPL 上测试:

scala> :load test.scala
Loading test.scala...
defined object S

scala> import S._
import S._

scala> Nil.head(1)
res0: S.List[Int] = Cons(1,Nil)

scala> Cons(1, Nil).head(4)
res1: S.List[Int] = Cons(4,Nil)

关于带有类型参数的 Scala 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50047998/

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