2011-03-14 3 views
3

私はいくつかのノートを通過していたと私は何かが間違っていることに気づいた。smlでレイジーなサスペンド

遅延計算をエミュレートする場合(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の正しいタイプを変更する必要はありますか? 私は、吊り下げられていない尾がどうなるのか知っています。 私はちょうど、中断されたバージョンに関してノートが何を言っているのか把握したい。

+0

面白い言語。聞いたことがない。 NJはいつ自分の言語を取得し、テキサスはそれをしないのですか? :P –

答えて

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

ここでの問題は、forceがタイプsuspの値をとるが、あなたはタイプ() -> 'aの値でそれを呼び出すことです。私。関数をsusp値から取り出して、susp値の代わりに関数でforceを呼び出します。あなたはちょうど行う必要があります:

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

ええ、ノートで座ったときに私はそれを試みましたが、私はそれがなぜノートでSusp(s)であったのか分かりませんでした。まあ...私はそれがタイプミスであり、人生が進むと仮定します。 – phwd