懒散的尾巴在sml

时间:2011-03-14 23:44:01

标签: sml smlnj

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

当模拟延迟计算(没有open Lazy;)时,可以对1的流进行以下操作。

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的正确类型,需要更改什么? 我知道尾巴没有停止会发生什么。 我只想弄清楚暂停版本的说明是什么。

1 个答案:

答案 0 :(得分:2)

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

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

fun ltail s = ltail' (force s)