2013-10-02 60 views
1

大家好,我对来自C#的Scala相当陌生。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.

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

布莱尔

回答

2

的问题是,与内部功能loop要定义一个新的类型T这是阴影外型T

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