Спасибо, я не знал, могли бы вы использовать блоки и typedef как этот. Сначала я попробую последний способ и, если необходимо, поработаю с шаблоном для последующих элементов.
для моделирования ленивого программирования возможно следующее:
// Have a datatype to wrap a computation
datatype 'a susp = Susp of (unit -> 'a)
// A function to hold the computation
fun delay(f ) = Susp(f)
Я знаю, что замыкания могут быть написаны с использованиемБлоки,
int multiplier = 7;
int (^myBlock)(int) = ^(int num) {
return num * multiplier;
};
Поэтому я думаю, что могу использовать это как аргумент функции. Следующим шагом будет использование функций без реальных аргументов (стоимость единицы например в SMLfn () =>
) и создание ленивых типов данных, как показано выше.
Возможно ли это или я должен искать другой, более очевидный путь?
Конечной целью было бы эмулировать поведение приостановленных вычислений из SML,
let val x = Susp(fn () => horribleComp(345))
in
force(x) + force(x)
end
где сила (х)
fun force (Susp(f)) = f ()