Разработчики проекта hsrs представили новый способ вызывать код на языке Rust из Haskell с полными типовой проверкой и автоматически генерируемыми FFI-биндингами. Инструмент позволяет аннотировать Rust-функции и структуры, после чего генератор создает на Haskell безопасный слой, который берет на себя управление памятью и преобразования типов. Для этого не нужно писать ручные обертки — система сама генерирует идеоматичный код.
В основе подхода лежит работа с аннотациями над стандартными типами Rust. Например, атрибут #[hsrs::data_type] превращает обычную структуру в прозрачный тип, передаваемый через указатель, который в Haskell обернётся в ForeignPtr с автоматической очисткой памяти. Функции помечаются директивой #[hsrs::function], после чего они становятся доступными как типобезопасные функции-обёртки на стороне Haskell. Если тип структурирован через #[hsrs::value_type], то структура передаётся по значению с помощью библиотеки Borsh, что устраняет необходимость вручную имплементировать трейты сериализации.
Генератор понимает стандартные контейнеры: Vec<T> превращается в список [T], а Option<T> и Result<T, E> мапятся в Maybe T и Either E T соответственно. Строки автоматически переводятся в Text. Базовые типы, такие как usize и isize, конвертируются в 64-битные целые числа Word64 и Int64, что корректно для современных архитектур x86_64 и aarch64. Для использования всего функционала на стороне Rust нужно добавить зависимость hsrs в Cargo.toml с указанием типа библиотеки staticlib, а на стороне Haskell установить runtime-пакет hsrs.
Особое внимание уделено совместимости с платформами. На 32-битных системах значения могут быть усечены, но разработчик сам отвечает за выбор архитектуры. В примере из статьи показан виртуальный машинный код, где enum Register и структура Point обрабатываются без потери типа. Функции вроде safe_div возвращают Either, а nonzero — Maybe, что типично для безопасного Haskell. Всё это работает поверх протокола Borsh, который сериализует сложные данные, уходящие через границу процессоров. Код генерируется простой командой hsrs-codegen, и результат полностью готов к компиляции, избавляя от рутинной верстки FFI.