【问题标题】:Puzzling Type Mismatch in Scala foldRightScala foldRight 中令人费解的类型不匹配
【发布时间】:2012-11-20 16:50:23
【问题描述】:

谁能告诉我这个函数定义有什么问题?

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

这里有什么问题?

【问题讨论】:

    标签: scala type-mismatch


    【解决方案1】:

    使用def incr[Int],您已经定义了一个名为Int 的任意类型,它会覆盖现有的类型。去掉 [Int] 类型参数,它可以正常工作,或者使用不同的名称,如 T

    【讨论】:

    • 同样的错误:def incr[T](l: List[T]): List[T] = l.foldRight(List[T]())((x,z) =&gt; (x+1) :: z) 还是不明白 (?)
    • 对不起,这么密集,愚蠢,明白了。谢谢。 def incr(l: List[Int]): List[Int] = l.foldRight(List[Int]())((x,z) =&gt; (x+1) :: z)
    • @Bill 任意类型没有+ 方法,这就是为什么您的元素类型需要为Int 或传递给 foldRight 的函数需要在Any 上工作.我不确定为什么会产生这个确切的错误消息,但这可能与编译器认为+ 是连接字符串的方法有关。如果编译器给你一个关于阴影类型的警告,那就太好了。
    • 是的 - 我正在完成我刚买的一本书(Scala 中的函数式编程)中的练习,并且已经习惯于引入类型参数,以至于我暂时变得盲目。我一晚上关机就意识到了我的错误。一个放松的头脑想得更清楚...... :-)
    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-21
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      • 1970-01-01
      相关资源
      最近更新 更多