Ленивый подвесной хвост в sml - PullRequest
3 голосов
/ 15 марта 2011

Я просматривал некоторые заметки и понял, что что-то не так.

При эмуляции отложенных вычислений (без 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? Я знаю, что происходит с не подвешенным хвостом. Я просто хочу выяснить, что говорят заметки для приостановленной версии.

1 Ответ

2 голосов
/ 15 марта 2011
fun ltail(Susp(s)) = ltail'(force s)

Проблема в том, что force принимает значение типа susp, но вы вызываете его со значением типа () -> 'a.Т.е. вы берете функцию из значения susp и затем вызываете функцию force вместо значения susp.Вы должны просто сделать:

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