Scala中的通用编程

Bla*_*son 1 generics scala generic-programming

大家好我对来自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)
  }
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

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

考虑到一切都是T型,我无法看到我的类型不匹配.

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

布莱尔

sen*_*nia 5

您应该从loop方法中删除type参数.替换loop[T]loop.

随着loop[T]要创建一个使用新名称类型参数T,所以T外面loop的方法和Tloop方法是不同的类型别名具有相同名称.

它被称为阴影.

有关类似问题,请参阅以下答案

  1. Scala类型参数错误,不是类型参数的成员
  2. Scala,使用通用特征扩展对象
  3. Scala中的泛型类型推断