此错误在高阶函数中意味着什么? [斯卡拉]

时间:2018-10-20 17:24:56

标签: scala functional-programming

我只需要以功能方式编写代码

这是我的代码的样子:

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 = / * ### worksheet ###生成$$ end $$ * / yoman(1。:: 5. :: Nil,sqrt)

像“ ^”这样的箭头位于最后一行的“生成”字下

1 个答案:

答案 0 :(得分:1)

首先,scala不喜欢使用::将int构造为double。

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)

您的库房看起来不错,但您可能要更新模式匹配项,因为示例中的第一个匹配项_将匹配所有情况。 当您传入空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

可能也有帮助:Implicit conversion from List[Int] to List[Double] fails