【问题标题】:Scala Polymorphic Function Type MismatchScala多态函数类型不匹配
【发布时间】:2017-12-29 00:41:35
【问题描述】:

当尝试运行一个对数组类型进行抽象的多态函数时,我得到一个类型不匹配的错误消息:

类型不匹配:预期:(Int) => 布尔值,实际:Int

  val listIntegers = List(55, 50, 25, 23, 21, 16, 15)

  def abstractSearchKey[A](a: List[A], p: A => Boolean): Int = {
    def loop(n: Int): Int ={
      if (n > a.length) -1
      else if (p(a(n))) n 
      else loop(n+1)
    }
    loop(0)
  }

  abstractSearchKey[Int](listIntegers, 25)   

我对这个错误消息感到困惑,因为这个练习是基于 Chiusano 的 Scala 函数式编程。事实上,在第 24 页,作者指出:

...p 函数必须接受 A 类型的值(因为它是 A => Boolean 类型的函数)

非常感谢您对此事提出任何建议或反馈!

【问题讨论】:

    标签: scala functional-programming polymorphism tail-recursion


    【解决方案1】:

    问题是您期望一个函数(Int => Bool 类型的谓词)作为abstractSearchKey 的第二个参数,而您正在传递25 这是一个Int

    例如,尝试传递一个像 x => x > 20 这样的 lambda 函数,以便能够使用这个谓词来切断循环:

    abstractSearchKey[Int](listIntegers, x => x > 20)
    

    编辑:来自 cmets 的 SergGr 刚刚指出您可能想要这个函数:x => x == 25,所以它可能是:

    abstractSearchKey[Int](listIntegers, x => x == 25)
    

    【讨论】:

    • 但是看看问题中的例子,它可能应该是x => x == 25。或者p 的类型应该改为A 并且loop 中的if 应该变成if (p == a(n)) n 之类的东西
    • 是的,如果你想返回元素为25的索引,你应该使用x => x == 25。您在问题中没有提到这一点,所以我使用了随机函数。
    • nicodp,我只想提一下,我不是 mberet,所以我的评论只是基于我对问题代码示例的解释的猜测:listIntegers 包含25,这也是正在传递给 abstractSearchKey 的参数
    • 哦,对不起。是的,我认为他希望通过该功能,谢谢。
    • 非常感谢你们!像魅力一样工作:)
    猜你喜欢
    • 2020-10-20
    • 2015-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多