1

大家好,我对来自 C# 的 Scala 相当陌生。

我正在尝试编写我自己的累积(折叠)版本我想知道为什么我会遇到以下问题:

def accumulate[T](list : List[T], initial: T, f: (T, T) => T) : T = {
    @tailrec def loop[T](list: List[T], accum: T) : T =
      if(list.length == 0)
        accum
      else{
        val head : T = list.head
        val res : T = f(accum,head)
        loop[T](list.tail, res)
      }
    loop(list,initial)
  }

我收到以下错误:

type mismatch;
 found   : accum.type (with underlying type T)
 required: T
        val res : T = f(accum,head)
                        ^

考虑到一切都是 T 型,我看不出我的类型不匹配。

任何想法/帮助将不胜感激。

布莱尔

4

2 回答 2

5

loop您应该只从方法中删除类型参数。替换loop[T]loop

随着loop[T]您使用 name 创建新的类型参数T,因此T外部loop方法和内部方法Tloop具有相同名称的不同类型别名。

这称为阴影

有关类似问题,请参阅这些答案:

  1. Scala类型参数错误,不是类型参数的成员
  2. Scala,扩展具有通用特征的对象
  3. Scala 中的泛型类型推断
于 2013-10-02T13:24:20.653 回答
2

问题在于,loop您使用内部函数定义了一个新类型T,它隐藏了外部类型T

编译器将它们视为定义不同的类型。如果您只是从(包括递归调用)中删除T类型参数,您应该会发现它编译得很好。looploop(list.tail, res)

于 2013-10-02T13:25:14.267 回答