Я новичок в скале и слежу за книгой "ФП в Скале". Прямо сейчас я пишу функцию развертывания для типа данных 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,личность (а));