2

パイプを使用して、ProxyFastまたはProxyCorrect型のMonadTransControlのインスタンスを作成しようとしています。これは私が持っているものです:

instance MonadTransControl (ProxyFast a' a b' b) where
  data StT (ProxyFast a' a b' b) a = StProxy { unStProxy :: ProxyFast a' a b' b Identity a}
  liftWith = undefined
  restoreT = undefined

liftWith や restoreT の書き方がわかりません。他のモナド トランスフォーマーのインスタンスはすべて、モナドを「交換」する関数を使用します。ProxyCorrect / ProxyFast の MonadTransControl のインスタンスはどのように見えますか? それとも書くことは不可能ですか?(はいの場合、パイプ 4.0 で可能ですか?)

4

1 に答える 1

5

リンクをありがとう、そして今、私はより良い答えを出すことができます.

いいえ、どちらのバージョンの を使用しても、これを実装する方法はありませんpipes。その理由MonadTransControlは、モナドトランスフォーマーが基礎となるベースモナドの単一レイヤーの上に構築されることを期待しているためです。MonadTransControlこれは、現在実装されているすべてのモナド変換子に当てはまります。

ErrorT  ~ m (Either e r)
StateT  ~ s -> m (r, s)
WriterT ~ m (r, w)
ReaderT ~ i -> m r
ListT   ~ m [r]  -- This version of ListT is wrong, and the true ListT
                 -- would not work for `MonadTransControl`

ただし、 aProxyは基本モナドの単一の層をラップしません。pipesこれは、基本モナドのレイヤーを好きなだけネストできる両方のバージョンに当てはまります。

実際、基底モナドを複数回ネストするモナド変換子は、次のMonadTransControlようにインスタンスを無視します。

FreeT     -- from the `free` package
ListT     -- when done "right"
ConduitM  -- from the `conduit` package

ただし、pipes実装しないからMonadTransControlといって、すべての希望が失われるわけではありません。 では、リソースの取得など、pipes-safe一般的に期待される多くの操作が実装されています。そのため、特定のユース ケースについて詳しく説明していただければ、問題に対する適切な に基づいた解決策があるかどうかを詳しく説明できます。MonadTransControlbracketpipes

于 2013-07-07T19:31:41.793 に答える