モナドスタックをどのように設計および構築しますか? 初めて、現実世界の問題を解決するために (トランスフォーマーを使用して) モナド スタックを構築する必要がありますが、どの順序でトランスフォーマーをスタックするか完全にはわかりません。ご存知のように、計算に kind がある限り* -> *
、基本的には何でもトランスフォーマーの内部モナドの役割を果たすことができます。したがって、いくつかの質問があります。
- 特定のトランスフォーマーをスタックの一番上に置く必要があります (例: ReaderT? WriterT?)。
- 設計を推進するものは何ですか? 直感?種類?(たとえば、API のニーズに応じてスタックを形成します)
- すべてのスタックは (ある程度) 相互に同形ですか? それとも、スタックを間違って構築すると、特定の基礎となるモナドを使用できなくなったり、大きな混乱が生じたりする可能性があり
lift . lift . liftIO [...]
ますか? 私の直感では、トランスフォーマーがいくつかのインスタンス (MonadReader、MonadIO など、ほとんどのトランスフォーマーがmtl
そうであるように) を派生させる場合、トランスフォーマーをどの順序で配置しても問題ないはずです。
ベテランの Haskeller から、ベスト プラクティスや経験則について聞くことに興味があります。
forever $ print "Thanks!"
A.