Scala 中的类型参数声明



我是新手,正在学习Scala编程。我正在努力编写以下代码。如果我尝试将"def combine"函数中的"(Double,Double("替换为声明的类型"typeDouble",那么为什么它不起作用。代码是 :

type typeDouble = (Double,Double)
def foo: (Double,Double) => Double = (x: Double,y:Double) => x*y
def combine(x: Double, y: Double, z: Double, fun1 : typeDouble => Double) = fun1(fun1(x,y), z)
combine(1,2,3, foo)

编译器 说:

type mismatch;
 found   : (Double, Double) => Double
 required: A$A228.this.typeDouble => Double
    (which expands to)  ((Double, Double)) => Double
combine(1,2,3, foo);}
           ^

请解释一下这个概念出了什么问题?

虽然参数列表和元组都写在括号中,但它们不是一回事。通过定义type typeDouble = (Double,Double)可以定义两个双精度的元组。那么fun1 : typeDouble => Double是一个函数,它接受的不是两个参数,而是一个需要成为元组的参数。

在错误消息注释中:

((Double, Double)) => Double

(Double, Double) => Double

注意:函数可以tupled,这意味着新函数接受单个元组中的所有参数。如果您愿意,可以使用以下命令使示例工作:

combine(1,2,3, foo.tupled)

为了(希望(在@Suma的答案中添加一个小的清晰度,请考虑您是否以不同的方式定义了foo:

def foo(x: (Double,Double)): Double =  x._1*x._2

这非常适合作为元组 2 到 Double 的函数。你也可以写

def foo: ((Double,Double)) => Double = x => x._1*x._2

或者(消除 ._ 表示法并增强可读性(

def foo: ((Double,Double)) => Double = {case (x,y) => x*y}

我怀疑这些版本中的某个是你在上面写下它时认为你在定义foo的方式。

最新更新