В чем разница между закрытием ржавчины и лямбдой Хаскелла?
Недавно я спросил о том, как положить кучу замыканий с одной и той же сигнатурой в вектор в Rust. Исходя из фона Haskell, это выглядело немного сложным, с закрытием Rust, каждый из которых имел свои собственные уникальные типы и нуждался в чертах для их представления. В Haskell lambda набирается своей сигнатурой, и если подпись та же, тип тот же.
Существует ли семантическая разница между закрытием Rust и функцией лямбда Haskell, которая делает эти различия?
Ответы
Ответ 1
Выбор ржавчины с использованием разных типов имеет две преимущества:
- Компилятор может стекировать выделение данных, которые вы закрываете (или внедряете в содержащую структуру данных)
- Поскольку он знает, какая функция ссылается на замыкание во время компиляции, он может статически отправлять вызов и даже встраивать вызов.
Вместо этого вы можете использовать Box<Fn>
. Это стоит выделение кучи и приводит к косвенному вызову, но взамен есть только один тип для каждой подписи.