弥合差距:介绍 hsrs,一个为 Rust 设计的类型安全 Haskell 绑定生成器

Integrating Rust and Haskell—two of the most powerful type systems in modern programming—is a powerful combination. However, creating the bridge between them has historically been fraught with friction. 直到现在,大多数绑定生成器都缺乏开发者对这两种语言所期望的丰富且类型安全的接口。

介绍 hsrs,一个为 Rust 设计的类型安全 Haskell 绑定生成器。旨在提供类似于 pyo3napi-rs 等工具的使用体验,hsrs 旨在为将 Rust 代码集成到 Haskell 应用中提供一种更符合人体工程学且类型安全的方式。

The Need for Type-Safe Bindings

许多开发者一直以来都在为缺乏能够自动生成丰富绑定的工具而苦恼。虽然存在像 hs-bindgen 这样的工具,但 hsrs 通过为 ResultMaybe 等复杂类型提供类型安全的绑定而脱颖而出。这确保了当从 Haskell 调用代码时,Rust 类型系统提供的相同安全保证得以保留,从而防止常见的 FFI (Foreign Function Interface) 接口错误。

Key Features and Architecture

Hsrs 利用 Rust 的过程宏 (procedural macros) 来允许开发者标记函数和数据类型以进行导出。通过这样做,它生成必要的胶水代码,使 Haskell 能够无缝地与 Rust 结构体和函数进行交互。

Handling Data Types

hsrs 最显著的优势之一是它能够将 Rust 结构体处理为 ForeignPtr(用于基于引用的交互)或作为具有完整编组 (marshalling) 功能的原生 Haskell 记录。这种灵活性允许开发者在将数据保留在 Rust 侧和将其保留在 Haskell 侧之间进行性能权衡。

Function Mapping

目前,该工具将标记为 #[hsrs::function] 的 Rust 函数转换为返回 IO 动作的 Haskell 函数。这是一个必要的设计选择,因为 Rust 函数可以执行任意的副作用,而 Haskell 的纯度是通过将这些调用封装在 IO monad 中来维持的。

Community Insights and Future Directions

社区对 the_flux 的反应表明,Haskell 的 GC (Garbage Collector) 与 Rust 的所有权模型之间的 GC 交互是主要的摩擦点。正如用户 @_flux 所指出的:

It would be so nice if these "well typed languages" would be able to interact better with each other. Alas, the GC will probably cause some friction... Maybe the GC would be less of a problem if we didn't want to have the best possible performance as well.

尽管存在这些挑战,该工具通过利用目前正处于生态系统大规模增长阶段的 Rust 编写的库,为扩展 Haskell 生态系统提供了可能性。

Potential Enhancements

根据社区的反馈,已经确定了几个未来改进的领域:

  • Pure Function Marking: 能够将某些 Rust 函数标记为纯函数(不安全地)以避免将其封装在 unsafePerformIO 中并获得纯 Haskell 函数。

  • Trait Translation: 由于两种语言都共享 Hindley-Milner (HM) 类型系统,因此有可能将 Rust traits 翻译成 Haskell type classes,从而提供更深层次的多态集成。

  • External Library Integration: 提高为外部 Rust 库中的类型生成 #[hsrs::data_type] 绑定的能力,而无需自定义包装类型。

通过提供一个更符合人体工程学的桥梁,hsrs 允许开发者在保持 Haskell 高层抽象的同时,利用 Rust 的性能和安全性。 ",

Sources