Есть ли несколько способов написания Thunk в SML?

Основной нубский вопрос:

У меня есть данные, которые мне нужно оценить лениво, самый распространенный способ сделать это, сделав thunks; как я привык это делать, это так:

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

все даст одинаковый результат.

Другие вопросы по тегам