在scala中延迟实现

时间:2014-03-20 03:02:34

标签: scala stream delay

我在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(整数)

我不知道为什么。任何帮助表示赞赏。

2 个答案:

答案 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}}