#scala #generics #types
#scala #дженерики #типы
Вопрос:
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 amp;amp; 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
}
}
}
Несоответствие, похоже, вызвано этой строкой
max(l1.tail,l2.tail, wyn :: help(l1.head,l2.head) :: Nil)
Когда я удаляю Nil из этой строки, проблема, похоже, исчезает, но я не могу использовать :: для создания нового списка.
Что я делаю не так?
Спасибо за вашу помощь
Ответ №1:
- Конечный оператор (выражение) метода — это то, что он возвращает. Так что переходите
help()
к началуmax()
, а не к низу. - Используйте
else
, чтобы превратить этиif
проверки в один операторif (..)
…else if (..)
…else
… ::
используется для добавления элемента в начало aList
. Если вам нужно добавить элемент в конецList
использования:
(очень неэффективно для aList
).
else max(l1.tail,l2.tail, wyn : help(l1.head,l2.head))
- Если вы превратите результат
max(l1,l2,Nil)
в aString
, вы не захотитеforeach(println)
его переопределять. Это будетprintln
каждый символString
.
Комментарии:
1. Я использовал wyn.foreach(print) для распечатки результата
2.
println(wyn)
короче, понятнее и эффективнее.3. Почему? это лучше?
4.
"abcde".foreach(print)
вызываетprint()
метод 5 раз, по одному разу для каждого символаString
, тогдаprintln("abcde")
println()
как метод вызывается только один раз.
Ответ №2:
Вы обращаетесь Double
к String
здесь:
val wyn = max(l1,l2,Nil).toString
затем вы пытаетесь добавить его к List[Double]
// List[Nothing]
// /
//
// ------ List[Double] --------
// / /
// ---------- List[Any] --------------
// / /
wyn :: help(l1.head,l2.head) :: Nil
// String Double Nil
таким образом, Scala должна определить тип результата, который будет List[Any]
, в то время max
как функция ожидает List[Double]
.
Короче говоря, не вызывайте toString
wyn
.