Что означает эта ошибка в функции высокого порядка?[Scala] - PullRequest
0 голосов
/ 20 октября 2018

Мне нужно написать код только функциональным образом

Вот так выглядит мой код:

val sqrt = (x: Double) => x*x
val doubleValue = (x: Double) => 2*x

val yoman = (list: List[Double], func: Function[Double, Double]) => list match {
case _ => func(list.head)
case Nil => list
}

yoman(1. :: 5. :: Nil, sqrt)
yoman(2. :: -6. :: Nil, doubleValue)

Функция должна возвращать список

Возвращает ошибку:

Ошибка: (9, 80) ')' ожидается, но найден целочисленный литерал.def get $$ instance $$ res0 = / * ### лист ### сгенерированный $$ end $$ * / yoman (1. :: 5. :: Nil, sqrt)

Стрелка, подобная этой«^» находится под «сгенерированным» словом в последней строке

1 Ответ

0 голосов
/ 20 октября 2018

Во-первых, scala не любит создавать целые числа как двойные с ::,

scala> val doubles1: List[Double] = 1 :: 5 :: Nil
                                      ^
       error: type mismatch;
        found   : List[AnyVal]
        required: List[Double]

, в то время как вы можете построить List[Double] с помощью конструктора List(int1, int2)

scala> val doubles1: List[Double] = List(1, 5)
doubles1: List[Double] = List(1.0, 5.0)

или укажите значения как double,

scala> val doubles1: List[Double] = 1d :: 5d :: Nil
doubles1: List[Double] = List(1.0, 5.0)

Ваш hof выглядит хорошо, но вы можете обновить совпадение с шаблоном, так как первое совпадение _ в вашем примере будет соответствовать всем юниверсам дел. Он взорвется, когда вы передадите пустое обновление List,

yoman(List.empty[Double], doubleValue) // throws java.util.NoSuchElementException: head of empty list

, чтобы проверить, не пуст ли список, прежде чем пытаться взять элемент head.

val sqrt = (x: Double) => x * x
val doubleValue = (x: Double) => 2 * x

val yoman = (list: List[Double], func: Function[Double, Double]) => list match {
  case head :: _ => func(head)
  case Nil => list
}

val doubles1: List[Double] = 1d :: 5d :: Nil
val doubles2: List[Double] = 1d :: 5d :: Nil

println(yoman(doubles1, sqrt)) //1.0
println(yoman(doubles2, doubleValue)) //2.0

Также может быть полезно: Неявное преобразование из List [Int] в List [Double] завершается неудачей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...