2011-03-14 94 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