3

我正在浏览一些笔记,我意识到有些不对劲。

在模拟惰性计算(没有open Lazy;)时,可以对一系列计算执行以下操作。

datatype 'a susp = Susp of (unit -> 'a)

datatype 'a stream' = Cons of 'a * ('a stream') susp
type 'a stream = ('a stream') susp

fun delay (f ) = Susp(f);

fun force  (Susp(f)) = f ();

val rec ones' = fn () => Cons(1, delay(ones'));

val ones = delay(ones')

fun ltail(Susp(s)) = ltail'(force s)   
and ltail' (Cons(x,s)) = s

但是为了获得悬挂的尾巴,类型不匹配。

operator domain: 'Z susp   
operand:         unit -> 'Y

ltail 的正确类型需要更改什么?我知道尾巴没有悬挂会发生什么。我只是想弄清楚这些笔记对暂停版本说了什么。

4

1 回答 1

2
fun ltail(Susp(s)) = ltail'(force s)

这里的问题是它force需要一个 type 的值susp,但是你用一个 type 的值来调用它() -> 'a。即,您将函数从susp值中取出,然后调用force函数而不是susp值。你应该这样做:

fun ltail s = ltail' (force s)
于 2011-03-15T01:30:23.540 回答