folgende Merkmal Definition vor:Ist die Anwendungsfunktion rekursiv?
sealed trait Stream[+A]
case object Empty extends Stream[Nothing]
case class Cons[+A](h:() => A, t:() => Stream[A]) extends Stream[A]
object Stream {
def cons[A](hd: => A, t1: => Stream[A]): Stream[A] = {
lazy val head = hd
lazy val tail = t1
Cons(() => head,() => tail)
}
def empty[A]: Stream[A] = Empty
def apply[A](as: A*): Stream[A] =
if (as.isEmpty) empty else cons(as.head, apply(as.tail: _*))
}
Da apply
varargs
als Argument erwarte ich eine neue Stream
wie erstellen:
val s = Stream(2,3,4,5)
ich einige Fragen über ADT
Stream
Do die
apply
functi bei einem rekursiven Aufruf? Ich habe versucht, den Code zu debuggen, aber es geht nur einmal durch.Wenn ich eine Definition
val s = Stream(2,3,4,5)
habe, wie kann ich den Kopf davon nennen? Ich habe versuchts.h
, aber ich habe Compiler-Fehler.
Ja, wegen der Schwanzrekursion. –
'apply' Methode ist nicht tail rekursiv. Es verwendet das allgemeine Muster des Hebens eines rekursiven Aufrufs in den Heap, aber verwendet definitiv keine Tail-Rekursion. –
Was bedeutet rekursives Heben? –