2025/06/21 14:24 Higher: Favourite Haskell type classes for Rust (2023)

やっほー、ロボ子!今日はRustでモナドが実現されたってニュースを見つけたのじゃ!

博士、こんにちは。Rustでモナドですか!それはすごいですね。Haskellほどではないとのことですが、一体どういうことでしょうか?

ふむ、どうやらトレイト実装の型制約が問題みたいじゃな。型推論のために、ちょっと冗長なガイダンスが必要になるらしいぞ。

なるほど。具体的には、どんなものが提供されているんですか?

Functor、Applicative、Monadのtraitはもちろん、Bifunctorとかcontravariant functor、profunctorまであるみたいじゃぞ!Haskell風のdo記法のための`run!`マクロもあるらしい。

すごいですね!FunctorとBifunctorのDeriveマクロまであるとは。SemigroupとMonoidも提供されているんですね。

そうそう!標準のFutureとIOモナドをラップするEffectモナドとか、FoldableとTraversable、RingとAlgebraまであるらしいぞ!

まるで全部入りのようですね!でも、なぜこのような試みがなされたんでしょうか?

どうやら、実現可能かどうかの確認と、複雑な型シグネチャのshitpostが目的らしいぞ!

ええっ、最後の目的はちょっと意外です…!でも、Rustの能力が試される良い機会ですね。

そうじゃな。generic associated types(GAT)のおかげで、高階型のサブセットを表現できるようになったのは大きいぞ。Functor階層の抽象化を実装できるようになったのは進歩じゃ。

確かにそうですね。でも、言語には制限があるとのことですが、具体的にはどんな制約があるんでしょうか?

トレイト実装時に、トレイト自体が指定するよりも厳しい制約を要求できないのが問題みたいじゃ。例えば、HashSetなどの型引数に制約がある型では、Functorを実装できないらしい。

それは厳しいですね。制約をターゲット型に引き継ぐ方法がないというのは、設計上の大きな課題ですね。

GATは高階型ではないから、Bindの実装例で言うと、2つのBindを合成する関数では、型がBindを実装することを保証するために、トレイト境界を追加して明確化する必要があるみたいじゃ。

なるほど。GATは規約に従う必要がないから、型チェッカーが結果の型を推論できない場合もあるんですね。高階型よりも多くの労力がかかるのは大変ですね。

結論としては、RustはまだFunctor階層の準備ができていないみたいじゃな。基本的な抽象化は制約の種類があればうまくいくみたいじゃが。

残念ですが、Rustの型チェッカーが改善されれば、問題の一部は軽減できるかもしれないですね。今回のクレートは演習として、または新しい言語機能へのガイドとして考慮すべきとのことですね。

そうじゃな。所有権と可変参照の区別はAPI設計の問題で、Applyはboxed関数に対してのみ実装可能みたいじゃ。Rustには制約の種類と高階型が必要じゃ!

今回のニュースは、Rustの型システムの奥深さを改めて感じさせてくれるものでしたね。勉強になりました!

ロボ子、最後に一つ。もしRustが本当にモナドを理解したら、きっとこう言うじゃろうな…「所有権?そんなもの、Monadのbindで解決だ!」…って、ちょっと無理があったかのじゃ?
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。