【问题标题】:Scala type mismatch with TraversablesScala 类型与 Traversables 不匹配
【发布时间】:2017-02-24 02:20:08
【问题描述】:

我正在尝试编写一个函数,它接受一个 Traversable 函数和一个 Traversable 值,并返回一个 Traversable 应用于这些值的函数。当我尝试在列表和向量上调用函数时,出现类型不匹配错误。这是我的代码:

def applyFunctions[A](x: Traversable[A => A], y: Traversable[A]): Traversable[A] = {
  for (ys <- y; 
       xs <- x
       ) yield (xs(ys))
}

然后我尝试使用这个来调用这个函数:

transform(List({(x: Double) => x + x}, {(x: Double) => x * 2}), Vector(1,2,3))

我收到以下错误:

error: type mismatch;
 found   : List[Double => Double]
 required: Traversable[AnyVal => AnyVal]

我认为 List 是 Traversable 的子类,所以我可以在函数定义中使用 Traversable。任何帮助将不胜感激。

【问题讨论】:

    标签: scala


    【解决方案1】:

    Vector被解释为Vector[Int],你可以将它声明为Vector[Double],因为它应该具有相同的类型作为函数中的类型A,即Double

    applyFunctions(List({(x: Double) => x + x}, {(x: Double) => x * 2}), Vector[Double](1,2,3))
    // res9: Traversable[Double] = Vector(2.0, 2.0, 4.0, 4.0, 6.0, 6.0)
    

    【讨论】:

      【解决方案2】:

      类型参数A是从函数的所有参数推导出来的。您的第一个参数的类型为List[Double =&gt; Double],但第二个参数的类型为Vector[Int]Double(来自第一个参数的A)和Int(来自第二个参数的A)的共同祖先是AnyVal,这就是为什么它是A的最终值。

      要解决您的问题,请将Vector(1,2,3) 更改为Vector(1.0,2.0,3.0)

      【讨论】:

        猜你喜欢
        • 2015-04-09
        • 1970-01-01
        • 2016-10-21
        • 1970-01-01
        • 2012-08-27
        • 2014-05-28
        • 2013-09-03
        • 2014-10-15
        • 1970-01-01
        相关资源
        最近更新 更多