Есть ли несколько способов написания Thunk в SML?
Основной нубский вопрос:
У меня есть данные, которые мне нужно оценить лениво, самый распространенный способ сделать это, сделав thunk
s; как я привык это делать, это так:
fun someFunc () =
let
fun myThunk () = 2 + 2
in
(* body *)
end
Но каждое руководство по Standard ML говорит мне, что это сделано так:
fun someFunc () =
let
val myThunk = fn () => 2 + 2
in
(* body *)
end
Итак, мои вопросы: это действительно имеет значение? Разве выход не совпадает в любом случае? И какая разница между созданием функции и привязкой лямбды к значению в любом случае?
1 ответ
Решение
Там нет заметной разницы в вашем случае. fun
Ключевое слово является синтаксическим сахаром для val rec
, который гарантирует, что вы можете ссылаться на имя, к которому привязываете свою функцию рекурсивным способом.
таким образом
fun myThunk () = 2 + 2
val rec myThunk = fn () => 2 + 2
val myThunk = fn () => 2 + 2
все даст одинаковый результат.