Полиморфная ошибка типа при рекурсии - как ее решить? - PullRequest
0 голосов
/ 11 октября 2019

Я новичок в скале и слежу за книгой "ФП в Скале". Прямо сейчас я пишу функцию развертывания для типа данных Stream, которую я воссоздаю. Проблема заключается в том, что средство проверки типов сообщает мне, что полиморфный тип, по-видимому, неверен для рекурсии.

Это признак Stream и его статический объект, включая функцию развертывания:

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 (в методе constantUnfold), A (в методе constantUnfold))) => Option [(A (в методе развернуть), (A (в методе constantUnfold),A (в методе constantUnfold)))]) StreamTrait [A (в методе свернуть)] требуется: StreamTrait [A (в методе constantUnfold)] def constantUnfold [A] (a: A): StreamTrait [A] = развернуть (a,личность (а));

Ответы [ 2 ]

0 голосов
/ 11 октября 2019

Кажется, у меня была определена другая функция, которая вызывала этот метод развертывания с неверными параметрами ... глупо, спасибо, в любом случае:)

0 голосов
/ 11 октября 2019

Если вы замените StreamTrait.empty на Empty, компиляция будет в порядке.

Не знаю, работает ли она ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...