2011-03-14 135 views
3

我正在阅读一些笔记,我意识到有什么是不对的。sml中懒惰的尾巴

当模拟延迟计算(没有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的正确类型? 我知道尾巴没有挂起会发生什么。 我只是想弄清楚这些笔记对暂停版本所说的话。

+0

有趣的语言。从来没有听说过。 NJ从什么时候开始获得他们自己的语言,德克萨斯不是? :P –

回答

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

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

fun ltail s = ltail' (force s) 
+0

是的,当我在笔记中坐下时,我尝试过,尽管我不确定为什么它在笔记中与Susp(s)一起。噢,我会认为这是一个错字,生活继续。 – phwd