【问题标题】:Lazy suspended tail in smlsml中懒惰的悬尾
【发布时间】:2025-06-21 01:20:01
【问题描述】:

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

当模拟惰性计算(没有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 的正确类型需要改变什么? 我知道尾巴没有悬挂会发生什么。 我只是想弄清楚这些笔记对于暂停版本的含义。

【问题讨论】:

  • 有趣的语言。从来没有听说过。新泽西州什么时候有了自己的语言而德克萨斯州没有? :P

标签: sml smlnj


【解决方案1】:
fun ltail(Susp(s)) = ltail'(force s)

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

fun ltail s = ltail' (force s)

【讨论】:

  • 是的,当我坐下来看笔记时,我试过了,虽然我不确定为什么笔记中会出现 Susp。哦,好吧......我会认为这是一个错字,生活还在继续。
最近更新 更多