在Scala中键入参数声明

时间:2017-04-13 12:26:04

标签: scala functional-programming

我是新手,学习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);}
           ^

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

2 个答案:

答案 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的。