我是新手,学习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);}
^
请解释这个概念出了什么问题?
答案 0 :(得分:3)
虽然参数列表和元组都写在括号中,但它们不是同一个东西。通过定义type typeDouble = (Double,Double)
,您可以定义两个双精度元组。然后fun1 : typeDouble => Double
是一个不接受两个参数的函数,而是一个需要为元组的单个参数。
在错误消息中注明:
((Double, Double)) => Double
VS
(Double, Double) => Double
注意:函数可以是tupled
,这意味着新函数接受单个元组中的所有参数。如果您愿意,可以使用以下方式使您的示例正常工作:
combine(1,2,3, foo.tupled)
答案 1 :(得分:1)
为@Suma的答案添加(希望)一点点清晰度,请考虑您是否以不同的方式定义了foo:
def foo(x: (Double,Double)): Double = x._1*x._2
这非常适合作为Double的tuple2的功能。你也可以写
def foo: ((Double,Double)) => Double = x => x._1*x._2
或(消除._符号并增强可读性)
def foo: ((Double,Double)) => Double = {case (x,y) => x*y}
我怀疑这些版本中有一个是您在上面写下来时如何定义foo的。