【问题标题】:Type parameter declaration in ScalaScala 中的类型参数声明
【发布时间】:2017-04-13 12:26:04
【问题描述】:

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

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);}
           ^

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

【问题讨论】:

  • 注意:这有点太冗长了:def foo: (Double,Double) => Double = (x: Double,y:Double) => x*y,你可以避免重复类型名称:def foo: (Double,Double) => Double = (x,y) => x*y,或def foo = (x: Double,y : Double) => x*y

标签: scala functional-programming


【解决方案1】:

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

在您的错误消息注释中:

((Double, Double)) => Double

(Double, Double) => Double

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

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

【讨论】:

    【解决方案2】:

    要(希望)为@Suma 的回答添加一点清晰的信息,请考虑您是否以不同的方式定义了 foo:

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

    这作为 tuple2 到 Double 的函数非常有效。你也可以写

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

    或(消除 ._ 符号并增强可读性)

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

    我怀疑其中某个版本是您在上面写下 foo 时所认为的定义方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-21
      • 1970-01-01
      • 1970-01-01
      • 2017-05-31
      • 2020-07-18
      • 1970-01-01
      相关资源
      最近更新 更多