Scala类型不匹配,应为:List[Double],实际为:List[Any]

Scala类型不匹配,应为:List[Double],实际为:List[Any],scala,generics,types,Scala,Generics,Types,不匹配似乎是由这条线引起的 object lab3zad4 extends App{ val l1 = List(2.0, -1.6, 3.2, 5.4, -8.4) val l2 = List(3.3, -3.1, 3.2, -4.1, -0.4, 5.5) val wyn = max(l1,l2,Nil).toString wyn.foreach(println) def max(l1: List[Double], l2: List[Double], wyn:List[Double

不匹配似乎是由这条线引起的

object lab3zad4 extends App{


val l1 = List(2.0, -1.6, 3.2, 5.4, -8.4)
val l2 = List(3.3, -3.1, 3.2, -4.1, -0.4, 5.5)
val wyn = max(l1,l2,Nil).toString

wyn.foreach(println)


def max(l1: List[Double], l2: List[Double], wyn:List[Double]) : List[Double] = {
 if(l1.isEmpty)
   wyn ::: l2
 if(l2.isEmpty)
   wyn ::: l1
// if(l1.nonEmpty && l2.nonEmpty)
  max(l1.tail,l2.tail, wyn :: help(l1.head,l2.head) :: Nil)


def help(x:Double, y:Double): Double = {
 if(x >= y)
   x
 else
   y

}
}
}
当我从该行中删除Nil时,问题似乎消失了,但我无法使用::创建新列表。 我做错了什么?
感谢您的帮助

您将
Double
转到
String
这里:

 max(l1.tail,l2.tail, wyn :: help(l1.head,l2.head) :: Nil) 
然后您尝试将其预先添加到
列表[Double]

val wyn = max(l1,l2,Nil).toString
因此Scala必须推断结果类型为
List[Any]
,而
max
函数期望
List[Double]

长话短说,不要在
wyn
上调用
toString

  • 方法的最终语句(表达式)是它返回的内容。因此,将
    help()
    移动到
    max()
    的顶部,而不是底部
  • 使用
    else
    将那些
    if
    检查转换为
    if(…)
    的单个语句<代码>否则如果(..)<代码>其他
  • 用于将元素前置到
    列表的头部。如果需要将元素附加到
    列表的末尾,请使用
    :+
    (在
    列表中效率非常低)
  • 如果将
    max(l1,l2,Nil)
    的结果转换为
    字符串
    ,则不希望
    foreach(println)
    覆盖它。这将
    println
    字符串
    的每个字符

  • 我使用了wyn.foreach(print)来打印结果
    println(wyn)
    更短、更清晰、更高效。为什么?更好吗?
    “abcde”。foreach(print)
    调用
    print()
    方法5次,对
    字符串的每个字符调用一次,而
    println(“abcde”)
    只调用
    println()
    方法一次。
    //                               List[Nothing]
    //                                   \/
    //
    //         ------ List[Double] --------
    //         \/                        \/
    //  ---------- List[Any] --------------
    //  \/                               \/
        wyn :: help(l1.head,l2.head) :: Nil
    // String         Double            Nil
    
    else max(l1.tail,l2.tail, wyn :+ help(l1.head,l2.head))