Спасибо, я не знал, могли бы вы использовать блоки и 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 ()

Ответы на вопрос(1)

Ваш ответ на вопрос