[Show HN] Hsrs:Rust 向け类型安全な Haskell バインディング生成ツール

2026/05/19 13:06

[Show HN] Hsrs:Rust 向け类型安全な Haskell バインディング生成ツール

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

hsrs クレイトは、手動の FFI グループコードの必要性を排除し、Haskell から Rust への安全で型安全な呼び出しを、自動的に生成されるバインディングを通じて可能にします。特定の Rust アノテーション——

#[hsrs::module]
,
#[hsrs::function]
,
#[hsrs::data_type]
,
#[hsrs::value_type]
, および
#[hsrs::enumeration]
——を使用することで、開発者はコードジェネレーター(
cargo install hsrs-codegen
を介してインストール)をトリガーし、慣用的な Haskellラッパーを生成します。システムは不透明型には
ForeignPtr
を使用してメモリ管理を透明に行い、FFI 境界を越える構文、コレクション、および_enum_については Borsh シリアライゼーションプロトコルを活用します。標準的な Rust タイプ(
Result<T, E>
Either
へ、
Option<T>
Maybe
へ、
Vec<T>
[T]
へ)は自動的により安全な Haskell 同等物に変換され、Haskell 側で追加の依存関係なしにシリアライゼーションを担当するのは Borsh です(これは
build-depends: hsrs >= 0.1 && < 0.2
を必要とします)。このアーキテクチャは x86_64 および aarch64 などの 64 ビットプラットフォームでは堅牢ですが、32 ビットシステムでは注意が必要です。32 ビットシステムでは基本データサイズのマップが
Word64
/
Int64
となり、結果として截断(truncation)を招く可能性があります。セットアップには、
Cargo.toml
にクレイトを追加し、
crate-type
["lib", "staticlib"]
に設定する、および Haskell で生成されたバインディングを取り込むことが含まれます。得られるエコシステムは、Rust のパフォーマンスと Haskell の安全性を組み合わせ、MIT OR Apache-2.0 ライセンスの下で、複雑なデータ構造の取り扱いとエラーハンドリングに特化した統合エコシステムを提供します。

概要: hsrs クレイトは、自動的に生成されたバインディングを使用して Haskell から直接 Rust への安全な呼び出しを可能にし、クロスラングージープログラミングを革新します。その最も重要な利点は、メモリ管理やデータシリアライゼーションといった複雑な技術的課題を透明に処理し、開発者を誤り易い手動のグルーコードの記述から解放することです。システムは

#[hsrs::module]
などの特定の Rust アノテーションを通じてこの機能を達成し、これによりコードジェネレーターが慣用的な Haskell ラッパーを作成します。重要な点は、Borsh プロトコル——シリアライゼーションの標準規格——を利用して構造体やコレクションが境界を跨ぐ方法を管理しており、明示的なメモリ処理なしでデータの整合性を確保することです。
Result
などの標準的な Rust タイプは自動的にそのより安全な Haskell 同等物(例:
Either
)に変換され、全体を通して型安全性を維持します。このアプローチは x86_64 および aarch64 などの 64 ビットアーキテクチャでシームレスに動作します。始めるには、開発者は単にhsrs-codegenツールをインストールして、アノテーションされた Rust ファイルからバインディングを生成すればよいです。最終的に、このクレイトは企業の開発者が効率性の高い Rust と堅牢な Haskell を組み合わせてハイパフォーマンスなアプリケーションを構築することを可能にし、安全性を犠牲にすることなく低レベルの FFI 専門知識を深めることなく、複雑なデータ構造とエラーハンドリングのための統合エコシステムを創造します。

主要ポイント一覧:

  • タイトル:
    hsrs
    クレイトを使用して、型安全で自動的に生成された FFI バインディングを通じて Haskell から Rust を呼び出します。
  • コア機能: Rust のタイプと関数をアノテーションし、コードジェネレーターを実行して慣用的な Haskell を入手し、メモリ管理(
    ForeignPtr
    経由)、シリアライゼーション(
    Borsh
    経由)、および型変換を処理します。
  • クイックスタート ステップ 1:
    #[hsrs::module]
    ,
    #[hsrs::value_type]
    ,
    #[hsrs::data_type]
    ,
    #[hsrs::enumeration]
    , および
    #[hsrs::function]
    などの属性を使用して Rust コードをアノテーションします。
  • クイックスタート ステップ 2: ツールをインストール (
    cargo install hsrs-codegen
    ) し、
    hsrs-codegen src/lib.rs -o Bindings.hs
    を実行して Haskell バインディングを生成します。
  • クイックスタート ステップ 3: 生成されたバインディング(
    import Bindings
    )を取り込んで Haskell で Rust 関数を使用し、メモリは自動的に管理され、タイプは Borsh を介してシリアライゼーションされます。
  • Rust 側のセットアップ:
    hsrs = "0.1"
    を依存関係として追加し、
    crate-type
    ["lib", "staticlib"]
    に設定します。
  • Haskell 側のセットアップ:
    build-depends: hsrs >= 0.1 && < 0.2
    でランタイムパッケージを追加し、これは Borsh シリアライゼーションを自動的に引き寄せ、追加の依存関係なしに処理します。
  • アノテーションテーブルマッピング:
    • #[hsrs::data_type]
      : ポインタ経由で渡される不透明な構造体を
      ForeignPtr
      新規タイプとして生成し、自動クリーンアップ機能を備えます。
    • #[hsrs::enumeration]
      : C と互換のある_enum_(repr(u8))を
      Word8
      新規タイプとして生成し、パターン同義語を備えます。
    • #[hsrs::value_type]
      : Borsh を介して値として構造体を渡り、
      data record
      および Borsh デリブリングの結果となります。
    • #[hsrs::function]
      : FFI 上でメソッドをエクスポートし、型安全な Haskell ラッパーを作成します。
    • #[hsrs::module]
      : データタイプとそのメソッドをグループ化し、型のすべての FFI グループコードを生成します。
  • 型変換の詳細:
    Result<T, E>
    Either E T
    へ、
    Option<T>
    Maybe T
    へ、
    Vec<T>
    [T]
    へ、
    String
    Text
    へ変換され、すべて Borsh を介して透明にシリアライゼーションされます。
  • サポートされているタイプテーブル:
    • 基本型(
      i8
      から
      u64
      ,
      bool
      ,
      usize
      /
      isize
      )はダイレクト(C FFI)転送を通じて Haskell 同等物に対応します。
    • Enum, 構造体、文字列、およびコレクション(
      Vec
      ,
      Option
      ,
      Result
      )については、境界を跨るシリアライゼーションに Borsh を利用します。
  • プラットフォーム注記:
    usize
    および
    isize
    はそれぞれ
    Word64
    および
    Int64
    に対応し、64 ビットプラットフォーム(x86_64, aarch64)に一致します;32 ビットプラットフォームでは値の截断が発生する可能性があります。
  • 完全な例: Enum, 値タイプ、
    Result
    , および
    Option
    の使用をデモンストレーションする小さな VM (
    quecto_vm
    ) が提供されており、生成された Haskell バインディングは
    new :: IO QuectoVm
    および
    Either VmError Int64
    を返す
    safeDiv
    などの符号を示しています。
  • ライセンス: MIT OR Apache-2.0。

本文

Haskell から Rust を呼び出すには、型安全で自動的に生成された FFI バインディングをご利用ください。Rust の型や関数にアノテーションを追加し、コードジェネレータを実行することで、メモリ管理、シリアライゼーション、および型のコンバージョンを自動で行うイディオマティックな Haskell コードを手軽に得ることができます。

クイックスタート

  1. Rust コードにアノテーションを加える

    #[hsrs::module]
    mod canvas {
        #[hsrs::value_type]
        pub struct Point {
            pub x: i32,
            pub y: i32,
        }
    
        #[hsrs::data_type]
        pub struct Canvas {
            points: Vec<Point>,
        }
    
        impl Canvas {
            #[hsrs::function]
            pub fn new() -> Self { Self { points: vec![] } }
    
            #[hsrs::function]
            pub fn add_point(&mut self, p: Point) { self.points.push(p); }
    
            #[hsrs::function]
            pub fn count(&self) -> u64 { self.points.len() as u64 }
        }
    }
    
  2. Haskell バインディングを生成する

    cargo install hsrs-codegen
    hsrs-codegen src/lib.rs -o Bindings.hs
    
  3. Haskell 側から利用する

    import Bindings
    
    main :: IO ()
    main = do
        c <- new
        addPoint c (Point 10 20)
        n <- count c
        print n  -- 1
    

    これで完了です。メモリ管理は

    ForeignPtr
    を介して自動的に実行され、複雑な型(例:
    Point
    )の境界を越えたシリアライゼーションは Borsh を使用して行われます。

セットアップ手順

  • Rust 側 — クレートに

    hsrs
    を追加します:

    [lib]
    crate-type = ["lib", "staticlib"]
    
    [dependencies]
    hsrs = "0.1"
    
  • Haskell 側

    hsrs
    ランタイムパッケージを追加します:

    build-depends:
        hsrs >= 0.1 && < 0.2
    

    これにより、Borsh シリアライゼーションが自動的に依存関係として導入されるため、追加の設定は不要です。

アノテーション可能な項目

アノテーション機能内容Haskell 側の生成結果
#[hsrs::data_type]
ポインタで渡される不透明な構造体自動クリーンアップ機能を備えた ForeignPtr の newtype
#[hsrs::enumeration]
C 互換の列挙型(repr(u8)パターン合成を備えた Word8 の newtype
#[hsrs::value_type]
Borsh を介して値として渡される構造体Borsh を継承する data record
#[hsrs::function]
FFI でエクスポートされるメソッド型安全な Haskell ラッパー関数
#[hsrs::module]
データ型とそのメソッドをグループ化型のすべての FFI ガードコードを生成

Rust の

Result<T, E>
Either E T
Option<T>
Maybe T
Vec<T>
[T]
String
Text
へと変換されます。これらはいずれも Borsh を通じて透過的にシリアライゼーションされます。

サポートされる型

RustHaskellデータ転送方法
i8, i16, i32, i64Int8, Int16, Int32, Int64直接 (C FFI)
u8, u16, u32, u64Word8, Word16, Word32, Word64直接 (C FFI)
boolCBool直接 (C FFI)
usize / isizeWord64 / Int64直接 (C FFI)
#[hsrs::enumeration]
列挙型
Word8 の newtype + パターン直接 (C FFI)
#[hsrs::value_type]
構造体
data recordBorsh
StringTextBorsh
Vec[T]Borsh
OptionMaybe TBorsh
Result<T, E>Either E TBorsh

プラットフォームに関する注意事項

usize
isize
はそれぞれ
Word64
および
Int64
にマッピングされます。これは 64 ビットプラットフォーム(x86_64、aarch64)と整合しています。32 ビットプラットフォームをターゲットとする場合、値が切り捨てられる可能性にご注意ください。

完全な例 列挙型、value type、Result、Option を含む小さな仮想マシン

Rust

#[hsrs::module]
mod quecto_vm {
    #[derive(Debug, PartialEq, Eq)]
    #[hsrs::enumeration]
    pub enum Register { Reg0, Reg1, Count }

    #[derive(Debug, PartialEq, Eq)]
    #[hsrs::value_type]
    pub struct Point { pub x: i32, pub y: i32 }

    #[derive(Debug, PartialEq, Eq)]
    #[hsrs::value_type]
    pub struct VmError { pub code: u32 }

    #[hsrs::data_type]
    pub struct QuectoVm {
        registers: [i64; Register::Count as usize],
        clock: usize,
    }

    impl QuectoVm {
        #[hsrs::function]
        pub fn new() -> Self { /* ... */ }

        #[hsrs::function]
        pub fn store(&mut self, r: Register, v: i64) { /* ... */ }

        #[hsrs::function]
        pub fn snapshot(&self) -> Point { /* ... */ }

        #[hsrs::function]
        pub fn safe_div(&mut self, a: Register, b: Register) -> Result<i64, VmError> { /* ... */ }

        #[hsrs::function]
        pub fn nonzero(&self, r: Register) -> Option<i64> { /* ... */ }
    }
}

生成された Haskell コード

newtype Register = Register Word8
  deriving (Eq, Show, Storable)
  deriving (BorshSize, ToBorsh, FromBorsh) via Word8

pattern Reg0 :: Register
pattern Reg0 = Register 0

data Point = Point
  { pointX :: Int32
  , pointY :: Int32
  } deriving (Generic, Eq, Show)
  deriving (BorshSize, ToBorsh, FromBorsh) via AsStruct Point

data VmError = VmError
  { vmErrorCode :: Word32
  } deriving (Generic, Eq, Show)
  deriving (BorshSize, ToBorsh, FromBorsh) via AsStruct VmError

data QuectoVmRaw
newtype QuectoVm = QuectoVm (ForeignPtr QuectoVmRaw)

new       :: IO QuectoVm
store     :: QuectoVm -> Register -> Int64 -> IO ()
snapshot  :: QuectoVm -> IO Point
safeDiv   :: QuectoVm -> Register -> Register -> IO (Either VmError Int64)
nonzero   :: QuectoVm -> Register -> IO (Maybe Int64)

ライセンス MIT または Apache-2.0

同じ日のほかのニュース

一覧に戻る →

2026/05/19 10:30

LLM による「過去六ヶ月の要約」――わずか五分で読み解く

## Japanese Translation: PyCon US 2026 における「2025 年 11 月の転換点」に関する振り返りは、AI ランドスケープが標準ハードウェア(例:Mac Mini)上で動作する実践的なローカルツールおよび個人用 AI アシスタントへと劇的に移行していることを示しました。2025 年後期から 2026 年初頭にかけての期間は、「最良」という称号を巡る過激な競争によって特徴づけられていました。11 月単独でわずか 2 ヶ月の間にトッププロバイダーにおけるリーダーシップは 5 回交代し、Claude Sonnet 4.5、GPT-5.1、Gemini 3、Codex Max などを経由した後、最終的に Claude Opus 4.5 に落ち着きました。この時代は、コーディングエージェントにおいて OpenAI や Anthropic の検証可能な報酬に基づく強化学習(Reinforcement Learning from Verifiable Rewards)への取り組みにより、単発的な動作から信頼できる日常利用ツールへと移行したことで推進されました。 顕著な技術的進展としては、Google が実用的なオープンウェイトモデルとして Gemma 4 シリーズをリリースしたことや、中国の研究所が GLM-5.1(1.5TB モデル)を公開したことが挙げられます。これらのモデルは、動物がエスクーターに乗っている様子やバージニア北部のカナザが自転車に乗っているような不可能なタスクのアニメーション生成といった驚くべき能力を発揮しました。特定のコミュニティプロジェクトは「Warelay」として始まりましたが、「OpenClaw」という名称を最終的に採用し、人気のあるローカル「個人用 AI アシスタント」の代名詞となりました。2026 年 2 月には新規モデルに対する需要が高まりシリコンバレーで Mac Mini が品切れになった一方で、一部のプロジェクトはセキュリティ懸念とパフォーマンスの問題のため廃止されました。全体のテーマは、自律的にホストされる知能のブームであり、ラップトップ搭載のモデルが業界リーダーと比較して期待を大きく上回る性能を発揮し始めた点にあります。

2026/05/17 1:49

Android スマートフォンを业余無線局トランシーバーに変えてください。

## Japanese Translation: kv4p HT は、Android スマートフォンとの統合を目的として設計されたオープンソースの VHF/UHF アマチュア無線トランスceiver です。専用バッテリーや外部充電器の必要性を排除するため、スマートフォンから電力を供給します。カスタム PCB(v2.0e)、SA818-V/U または DRA818V/U モジュール、SMA メスアンテナなどの部品の使用により構成され、SMS 風のメッセージングおよび位置情報ビーコン機能(APRS)を含む高度なデータ通信タスクをサポートします。法的に運用するためには、少なくとも技師級のアマチュア無線免許証を保有している必要があります。製品には保証がありません。フルデザインと GPL3 ライセンスの ESP32 ファームウェアは GitHub 上に公開されており、3D プリンター用ファイルも用意されているため、DIY による組み立てが可能で、モジュール/PCB のハンダ付け、接着ゲルパッドによる装着、3D プリント製ケースの取り付けを伴います。新規ユーザーは、事前に組み立て済みのベンダーキットを購入しない場合は、ソフトウェアを手動でフラッシュする必要があります。本システムは、2017 年以降の Android 8 以上のデバイスとのみ互換性があります。リアルタイムクローズドキャプション、PTT 用のハプティックフィードバック、アニメーション制御など、アクセシビリティ機能により、多様なユーザーにとって使いやすさが向上しています。

2026/05/19 13:24

コーデックス・マキシング(Codex-maxxing)

## Japanese Translation: この文は、短命なチャットセッションから、複雑な知識労働に適した耐久性のある長時間稼働型コーディングエージェントへの転換を描いています。これらのエージェントは、「compaction(コンパクト化)」という機能を用いて古いのメッセージを剪定し、コスト超過やコンテキスト制限を防ぎつつ不可欠な履歴を保持しながら、数ヶ月間自動化された動作を持続させます。ユーザーは「Chief of Staff」のようなメガスレッドをピン留めして好みを蓄積し、Command-1 から Command-9 などのショートカットを通じてワークストリームを舵取りできますが、オフキャッシュのスレッドは新規の短寿命スレッドよりも高いコストを支払う可能性があります。エージェントは Codex および Wispr Flow を通じて音声入力を受付けることができ、システム全体での口述が可能になり、タイピング単独よりも豊富なコンテキストを実現します。ユーザーはツール呼び出し後(steering)に新たな方向性を注入し、ステップが完了するのを待たずにエージェントを誘導できます。共有メモリシステムはチャット外に Obsidian クォート内にアーティファクト(AGENTS.md を含む)を保存しており、これらを検証、編集、差分表示することを可能にします;GitHub でリポジトリとしてホストされる場合、クラウドツールを通じてメモリの更新内容を確認でき、審査されていない対話の「vibes(雰囲気)」が蓄積するのを防ぎます。$slack、$gmail、$calendar、$browser、@chrome、および@computer といったコネクタは、ローカルのウェブ表面、認証済みのブラウザ状態、Twitter やデスクトップアプリなどの GUI アプリケーションなど、追加機能を提供します。Hatch Pet などのインストール可能なスキルは再利用可能なワークフローをパッケージ化し、エージェントが再教育なしでタスクを繰り返せるようにします。リモートコントロール機能により、ユーザーは作業マシン上で長時間稼働するタスクを開始し、モバイルデバイスからステップを承認することで進捗を持続させつつ管理できます。スレッドローカルハートビートは、Slack/Gmail を 30 分ごとに、フィードバックを 15 分ごとにといった再帰的なチェックをスケジュールし、ユーザーの常在なしでループを稼働させます。ゴールはエージェントに明確な仕上げラインと成功基準を与え、例えば元の単一テストを全てパスしながら Python Rich を Rust に移行する場合などに適用されます。サイドパネルはアーティファクト(Markdown、PDF、スプレッドシート)を検証し、ウェブ表面(index.html、Storybook、Slidev)を操作し、ループを壊さずに変更を確認する作業領域として機能します。

[Show HN] Hsrs:Rust 向け类型安全な Haskell バインディング生成ツール | そっか~ニュース