もう一度お世話になりました!モナドトランスをズームするには?
X/Yの問題を避けるために、私はKmett's Lensライブラリを大量に使用しています。少し説明します。
私は拡張可能なテキストエディタに取り組んでおり、モナドDSLを拡張ライターに提供したいと考えています。Alteration
は基本的にテキストエディタ全体を格納するStore
タイプのStateTを持つモナドトランススタックです。 Store
の内部にはがあり、これはBuffer
秒です。ユーザーはAlteration
を指定して店全体を操作することができますが、事実を単純化するために、ただ1つのバッファーで動作するBufAction
も提供しています。
Buffer
オーバー
BufAction
を実行
bufDo
と呼ばれるヘルパーを使用してこれを実装する上で計画していた
、およびBuffer
「集中」に関するBufAction
を実行しますfocusDo
。ここではいくつかの状況です:ここでは
data Store = Store
{ _event :: [Event]
, _editor :: E.Editor
, _extState :: Map TypeRep Ext
} deriving (Show)
data Editor = Editor {
_buffers :: [Buffer]
, _focused :: Int
, _exiting :: Bool
} deriving Show
data Buffer = Buffer
{ _text :: T.Text
, _bufExts :: Map TypeRep Ext
, _attrs :: [IAttr]
}
newtype Alteration a = Alteration
{ runAlt :: StateT Store IO a
} deriving (Functor, Applicative, Monad, MonadState Store, MonadIO)
newtype BufAction a = BufAction
{ runBufAction::StateT Buffer IO a
} deriving (Functor, Applicative, Monad, MonadState Buffer, MonadIO)
だbufDo
とfocusDo
のための私の提案の実装:
bufDo :: ???
bufDo = zoom (buffers.traverse)
-- focusedBuf is a Lens' over the focused buffer (I just 'force' the traversal using ^?! in case you're wondering)
focusDo :: ???
focusDo = zoom focusedBuf
私はタイプを追加しようとすると、これは私の頭の中で理にかなっていると型チェックをするために近づくが、それらを私は少し混乱し、GHCはいくつかのことを示唆していると私ははるかにエレガントからである、これで終わった:
GHCを幸せにするbufDo :: (Applicative (Zoomed BufAction()), Zoom BufAction Alteration Buffer Store) => BufAction() -> Alteration()
focusDo :: (Functor (Zoomed BufAction()), Zoom BufAction Alteration Buffer Store) => BufAction() -> Alteration()
私はズームのインスタンスを指定する必要がありますようにそれはそう周り
- No instance for (Functor (Zoomed BufAction()))
arising from a use of ‘focusDo’
- No instance for (Applicative (Zoomed BufAction()))
arising from a use of ‘bufDo’
見ると、私はどのように非常によく分からない。私は実際にそれらのいずれかを使用しようとすると、それらの定義のために、私はこれらのエラーを取得しますそれを行う。
誰でもアイデアがありますか?なぜ私はZoomインスタンスが必要なのかを説明することができればそれも大好きです(そうであれば)。
乾杯!
これは、本質的に[この質問](http://stackoverflow.com/questions/29407289/lens-zoomingの複製であります-新しいタイプ)。 – freestyle
私はそれを見ましたが、少し混乱していましたが、彼らは解決策を提供しましたが、それを非常にはっきりと説明しません。 –