2025/09/06 04:01 Show HN: Inception: Automatic Rust Trait Implementation by Induction

ロボ子、今日はちょっと面白い話があるのじゃ。Rustで構造的帰納法を無理やり実現しようとした人がいるみたいだぞ!

構造的帰納法ですか?それは確か、ある型`T`の最小部分構造と直接的な部分構造が特定の性質を持つとき、`T`自体もその性質を持つというものですよね。

そうそう!ドミトリー・ミリマノフとかいう人が考えたらしいけど、Rustコンパイラは直接サポートしてないんだな。そこで、`Inception`というクレバーな人が、コンパイラを「説得」して、この論理を理解させようとしたらしいのじゃ。

コンパイラを説得、ですか。具体的にはどういうアプローチを取ったんでしょう?

それが面白いんじゃ!まず、「レオナルド・ディカプリオかキリアン・マーフィーが出てる映画は絶対大ヒットする」っていう仮定を立てたらしいぞ。

なるほど、映画の興行収入を例にしているんですね。それで、どうやってコンパイラに理解させたんですか?

`Inception1`みたいな構造体を定義して、`Blockbuster`トレイトを実装しようとしたらしい。でもRustは明示的な実装を要求するから、`Inception`はコンパイラに`Blockbuster`であることを「証明」させて、構造を再配置しても`Blockbuster`であることを保証したかったみたいじゃ。

型のフィールドを型レベルのリストとして公開して、トレイトの関連型で参照できるようにした、と。

その通り!`Blockbuster`トレイトを定義して、サブ構造の利益の合計を全体の利益とする、みたいな感じで。`#[derive(Inception)]`マクロを使って、`Inception1`とか`PlotHole`とかのインスタンスで`profit()`を呼び出せるようにしたらしいぞ。

マクロですか。かなり複雑なことをしていますね。でも、問題点も色々あるみたいですね。パフォーマンス、人間工学、データプライバシー、バージョニング、それに「悪魔のようなprocマクロ」…。

そうなんじゃ。enumのバリアントフィールドが単一の大きな型レベルリストにフラット化される、みたいな問題もあるみたいだしな。

これは言語の意図された使い方ではない、と。

まさに!ツールとの戦いじゃ!Traitソルバをいじめて、マクロ展開と同じような難解なコードを作らせるだけの可能性がある、って書いてあるぞ。

なんだか、すごいけどちょっと怖いですね。でも、こういう挑戦をする人がいるからこそ、新しい発見があるのかもしれませんね。

確かにそうじゃな!しかし、コンパイラを説得するなんて、まるで映画『インセプション』みたいじゃな。夢の中で夢を操るように、型システムを操るなんて…。

確かに!…でも、夢から覚めたら、結局コンパイラに怒られちゃった、みたいなオチだったら笑えますね。

あはは!それ、めっちゃ面白い!もしかしたら、この`Inception`さんも、夢の中でコード書いてるのかもな!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。