2013-10-02 79 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類型參數,你應該發現它編譯得很好。