Во-первых, 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] завершается неудачей