我在scala中实现了以下cons_stream函数,但是我不知道为什么。
def cons_stream[T, U](x : T, y : U) =
{
def delay = () => y
/// Delay takes no parameters but returns y
(f : String ) =>
{
if ( f == "x") x
else if( f == "y") delay
else throw new Error("Invalid string use x or y")
}
}
相应的汽车和cdr功能是:
def stream_car[T](f : String => T) : T = f("x")
def stream_cdr[T](f : String => Any) : T = force(f("y").asInstanceOf[() => T])
现在我定义了以1
开头的流整数def integers_starting_from_n[T, U](n : Int) : String => Any =
{
cons_stream(n, integers_starting_from_n(n+1))
}
不幸的是,当我尝试使用stream_car或stream_cdr访问流时,我得到了堆栈溢出:
def integers = integers_starting_from_n(1)
stream_car(整数)
我不知道为什么。任何帮助表示赞赏。
答案 0 :(得分:0)
我认为堆栈已满integers_starting_from_n
。正确?该函数是递归的,并且在执行cons_stream
之前被调用,因为它将integers_starting_from_n(n+1)
的值作为参数。
答案 1 :(得分:0)
为了定义流,您可以使用=>
前缀y
来使用call-by-name参数。对于您的示例,请使用def cons_stream[T, U](x:T, y: => U)
进行名称调用。
{{1}}