В чем разница между закрытием ржавчины и лямбдой Хаскелла?

Недавно я спросил о том, как положить кучу замыканий с одной и той же сигнатурой в вектор в Rust. Исходя из фона Haskell, это выглядело немного сложным, с закрытием Rust, каждый из которых имел свои собственные уникальные типы и нуждался в чертах для их представления. В Haskell lambda набирается своей сигнатурой, и если подпись та же, тип тот же.

Существует ли семантическая разница между закрытием Rust и функцией лямбда Haskell, которая делает эти различия?

Ответ 1

Выбор ржавчины с использованием разных типов имеет две преимущества:

  • Компилятор может стекировать выделение данных, которые вы закрываете (или внедряете в содержащую структуру данных)
  • Поскольку он знает, какая функция ссылается на замыкание во время компиляции, он может статически отправлять вызов и даже встраивать вызов.

Вместо этого вы можете использовать Box<Fn>. Это стоит выделение кучи и приводит к косвенному вызову, но взамен есть только один тип для каждой подписи.