Scala foldRight中令人困惑的类型不匹配

时间:2012-11-20 02:45:22

标签: scala type-mismatch

有人可以告诉我这个函数定义有什么问题吗?

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)
                                                ^

这里有什么问题?

2 个答案:

答案 0 :(得分:7)

使用def incr[Int],您已定义了名为Int的任意类型,该类型会覆盖现有类型。摆脱[Int]类型参数,它可以正常工作,或使用其他名称,如T

答案 1 :(得分:2)

Luigi说的对我有用。我不确定为什么你会想要type参数,因为你已经将输入指定为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)