【问题标题】:Polymorphic type error during recursion - how to solve?递归期间的多态类型错误 - 如何解决?
【发布时间】:2019-10-11 12:26:35
【问题描述】:

我是 scala 的新手,并且正在关注“FP in Scala”一书。 现在我正在为我正在重新创建的 Stream 数据类型编写展开函数。 问题是,类型检查器告诉我多态类型似乎不适合递归。

这是 Stream trait 及其静态对象,包括展开函数:

sealed trait StreamTrait[+A] {}
case object Empty extends StreamTrait[Nothing];
case class Cons[+A](h: () => A, t: () => StreamTrait[A]) extends StreamTrait[A]

object StreamTrait {
  def cons[A](hd: => A, tl: => StreamTrait[A]): StreamTrait[A] = {
    lazy val head = hd;
    lazy val tail = tl;
    Cons(() => head, () => tail);
  }

  def unfold[A, S](z: S)(f: S => Option[(A, S)]): StreamTrait[A] = {
      f(z) match {
        case None => StreamTrait.empty
        case Some(tuple) =>
          StreamTrait.cons(tuple._1, unfold[A, S](tuple._2)(f))
      }
  }
}

输出是:

多态表达式不能被实例化为期望的类型; 找到:[A(在方法展开中)](f:((A(在方法常量展开中),A(在方法常量展开中)))=>选项[(A(在方法展开中),(A(在方法常量展开中), A(在方法常量Unfold)))])StreamTrait[A(在方法展开)] 必需:StreamTrait[A(在方法 constantUnfold)] def constantUnfold[A](a: A): StreamTrait[A] = unlock(a, identity(a));

【问题讨论】:

  • 无法复制。对我来说,错误是“值empty不是对象Playground.this.StreamTrait的成员”scastie.scala-lang.org/PSzLgtcbREyMw3GdIRQMKg
  • 在我将def empty = Empty 添加到StreamTrait 后,它对我来说很好。
  • 错误消息包括一些constantUnfold,您的代码中缺少这些constantUnfold。也许您发布了错误的版本?

标签: scala scala-streams


【解决方案1】:

如果将StreamTrait.empty 替换为Empty,则编译正常。

不知道它是否有效......

【讨论】:

  • StreamTrait.empty 是一个工厂构造函数(如果你在 FB 中这样称呼它?)我也有在对象中。我忘了包括它....但即使在用 Empty 替换它之后出现同样的错误信息。
【解决方案2】:

似乎我定义了另一个函数,该函数用错误的参数调用了这个展开方法...傻我,无论如何都要感谢 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 2016-01-27
    相关资源
    最近更新 更多