2

私は最近 Snap のソースを読んでいますが、これは素晴らしいことですが、Snaplet Handler のソースを読み始めたとき、RST、Lensed、LensT の抽象化に行き詰まりました。

newtype RST r s m a = RST { runRST :: r -> s -> m (a, s) }
newtype LensT b v s m a = LensT (RST (Lens b v) s m a)
newtype Handler b v a = Handler (LensT (Snaplet b) (Snaplet v) (Snaplet b) Snap a)

LensT が Lensed に変更されました

newtype Lensed b v m a = Lensed { unlensed :: ALens' b v -> v -> b -> m (a, v, b) }

そしてSnaplet Design言ったWe switched to a slightly more specialized monad formulation called Lensed that avoids traversal of the whole state hierarchy when the state is manipulated.

Snap と Snaplet Handler の実装にはギャップがあるように感じます。キーは RST、LensT、Lensed です。参考になるドキュメントはありますか?

4

1 に答える 1