2012-11-20 65 views
4

有人可以告訴我這個函數定義有什麼問題嗎?Scala中的類型不匹配foldRight

def incr[Int](l: List[Int]): List[Int] = 
    l.foldRight(List[Int]())((x,z) => (x+1) :: z) 

Scala編譯器抱怨類型不匹配的功能傳遞給foldRight體:

<console>:8: error: type mismatch; 
found : Int(1) 
required: String 
      l.foldRight(List[Int]())((x,z) => (x+1) :: z) 
               ^

這裏有什麼問題嗎?

回答

7

使用def incr[Int]您定義了一個名稱爲Int的任意類型,它覆蓋了現有類型。擺脫[Int]類型參數,它工作正常,或使用不同的名稱,如T

+0

與此錯誤相同的錯誤:def incr [T](l:List [T]):List [T] = l.foldRight(List [T]())( (x,z)=>(x + 1):: z)'仍然不明白(?) –

+1

對不起,如此密集,愚蠢,明白了。謝謝。 (列表[Int]):List [Int] = l.foldRight(List [Int]())((x,z)=>(x + 1):: z)' –

+0

@ Bill an任意類型沒有'+'方法,這就是爲什麼你的元素類型需要是'Int',或者你傳遞給foldRight的函數需要處理'Any'。我不確定爲什麼會產生這個確切的錯誤信息,但它可能與編譯器有關,因爲'+'是串聯字符串的方法。如果編譯器給出了關於陰影類型的警告,那將會很好。 –

2

Luigi說什麼爲我工作。我不知道你爲什麼會想類型的參數,因爲你已經指定輸入爲INT的列表:

def incr(l: List[Int]): List[Int] = l.foldRight(List[Int]())((x,z) => (x+1) :: z) 

incr(List(1,2,3))     //> res0: List[Int] = List(2, 3, 4) 

但在阿里納斯並沒有涉及到實際的問題,如果是這樣的預期結果,另一種方法可能是:

def incr2(l:List[Int]):List[Int] = l map (_+1)