型クラスの無モナドとの表記を行う再バインドモナドは、モナドアクションのすべての使用において、MonadDict
モナドインスタンス引数(const
を使用)を無視することを避けることができますか?(>> =)再バインドし、このように渡す明示的な辞書を使用してモナドのために戻すことができる
答えて
あなたはこのように行うことができます。
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE RebindableSyntax #-}
{-# LANGUAGE RecordWildCards #-}
module Lib where
import Prelude hiding(return, fail, (>>=), (>>))
data MonadDict m = MonadDict
{ (>>=) :: forall a b. m a -> (a -> m b) -> m b
, (>>) :: forall a b. m a -> m b -> m b
, return :: forall a. a -> m a
, fail :: forall a. String -> m a
}
monadDictIO :: MonadDict IO
monadDictIO = ...
foo :: MonadDict m -> String -> m()
foo = ...
usage = let
monadicCode [email protected]{..} = do
ln <- getLine
putStrLn ln
foo m ln
in monadicCode monadDictIO
興味深い。これは、 '-XRecordWildCards'でも動作します:それぞれ' '= 'と' '' 'の' bind'フィールドを呼び出すと、 'monadicCode MonadDict {..} = do ...'だけ使うことができます。これが良いアイデアかどうか私は確信していませんが、これは間違いなく興味深いものです。 – leftaroundabout
@leftaroundaboutはい、あなたは正しいです。 – freestyle
短いと間違った答えは(>>=)
に第二引数の戻り値の型からMonadDict m
引数をドロップです:
(>>=) :: (MonadDict m -> m a) -> (a -> m b) -> (MonadDict m -> m b)
しかし、それはありません本当にすべての構文問題を解決します。ある人がタイプMonad m => a -> m b
の既存の矢印を持っていて、明示的な辞書を渡すとタイプa -> (MonadDict m -> m b)
になり、(>>=)
の2番目の引数として使用できなくなります。関数drop :: (MonadDict m -> m b) -> m b
を2番目の引数と互換性を持たせるには、MonadDict
を渡す理由はありません。
あなたはMonadDict m
を読むためReaderT
変圧器を再発明しています。
newtype ReaderT r m a = ReaderT { runReaderT :: r -> m a }
あなたはそれがm a
ReaderT (MonadDict m) m a
へのINGのlift
の同等だconst
を使用しているすべての時間。あなたの例は、const
の代わりにlift
と書かれていると、それほどよく知られていないように見えます。
usage = let
monadicCode = do
ln <- lift getLine
lift . putStrLn $ ln
in monadicCode monadDictIO
ReaderT
を使用した完全な例です。おそらくReaderT (MonadDict m) m
の新しいタイプを作成し、lift
の別のタイプを作成する方が良いでしょう。 (>>=)
とreturn
の実装は、のbind
またはret
を使用することを除いて、ReaderT
と同じです。あなたはそれを独自のタイプを与える場合
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE RebindableSyntax #-}
module Lib
(usage
) where
import Prelude hiding ((>>=), return)
import qualified Prelude as P ((>>=), return)
import Control.Monad.Trans.Reader
data MonadDict m = MonadDict {
bind :: forall a b. m a -> (a -> m b) -> m b ,
ret :: forall a. a -> m a }
type ReadM m a = ReaderT (MonadDict m) m a
(>>=) :: ReadM m a -> (a -> ReadM m b) -> ReadM m b
m >>= k = ReaderT $ \[email protected] { bind = bind } -> bind (runReaderT m d) (\a -> runReaderT (k a) d)
return :: a -> ReadM m a
return a = ReaderT $ \[email protected] { ret = ret } -> ret a
lift :: m a -> ReadM m a
lift m = ReaderT $ \_ -> m
monadDict :: Monad m => MonadDict m
monadDict = MonadDict {
bind = (P.>>=),
ret = P.return
}
example1 :: String -> ReadM IO()
example1 a = do
lift . putStrLn $ a
lift . putStrLn $ a
example2 :: ReadM IO()
example2 = do
example1 "Hello"
ln <- lift getLine
lift . putStrLn $ ln
usage :: IO()
usage = runReaderT example2 monadDict
あなたは独立基礎となるm
のMonad
インスタンスとそれを装備し、RebindableSyntax
で済ますことができます。
newtype ReadMD m a = ReadMD {runReadMD :: MonadDict m -> m a}
instance Functor (ReadMD f) where
fmap = liftM
instance Applicative (ReadMD f) where
pure = return
(<*>) = ap
instance Monad (ReadMD m) where
m >>= k = ReadMD $ \[email protected] { bind = bind } -> bind (runReadMD m d) (\a -> runReadMD (k a) d)
return a = ReadMD $ \[email protected] { ret = ret } -> ret a
- 1. kubernetesは、私がkubernetesにリモートアクセスしたいが、私はここに、この</p> <p>に証明書を使用したくない証明書
- 2. 明示的にモナドに戻っていないバインド関数の代替手段
- 3. 私は</p> <p>Aを戻すには、このコードを使用しようとしている
- 4. Actionscriptで型を変数として渡すことはできますか?私は</em>はこのようなルックスを書きたい<em>
- 5. 使用の閉鎖のようにあなたは、値としてクロージャを使用することができます</strong><strong>ActiveDataProviderで
- 6. SL3のComboboxに辞書<string、string>をバインドします
- 7. なぜ私の関数の戻り値として入れ子になったIOモナドIO(IO())がありますか?それは単純な定義を持っているなるようにどのように私はこれを書き換えることができ、 <code>deleteAllMp4sExcluding :: [Char] -> IO (IO()) </code>代わりにまた</p> <p><code>deleteAllMp4sExcluding :: [Char] -> IO()</code>の:
- 8. あなたはどのようにして辞書を辞書として使用していますか
- 9. jqueryのために<image id>をどうやって引き渡すことができますか?
- 10. パラメータのコンストラクタでは例</p> <pre><code><workspace [testparam]="test"></workspace> </code></pre> <p>のために、私は私が<code>ngOnInit</code>メソッド内で使用することができます私の角度2ルートコンポーネントにパラメータをバインドしようとしている
- 11. MongoEngineは、私は、次のMongoEngineドキュメント</p> <pre><code>{ '_id': 'some_id', 'data': 'some_data' } </code></pre> <p>どのように私<code>delete</code>この文書がMongoEngineを使用することができている文書
- 12. ラムダ式のパラメータについて、モナドに渡すことが証明できるものは何ですか?
- 13. C++ 11を渡す 'この' のparamenterとしてのstd ::私がのstd :: make_shared</p> <p>例使用して 'この' コンストラクタに渡すためにしようとしている
- 14. 辞書<String、SomeEnum>をLINQを使用して辞書<String,Int>に変換しますか?
- 15. 辞書の型を気にしない場合、どのように辞書をパラメータとして渡すのですか?この質問に似て
- 16. ギャツビーは、私がここギャツビー</p> <p>をしようとしているため、蓄熱ランタイム/ランタイムモジュール
- 17. Djangoテンプレート、私は私が試した、カットフィルタにテンプレートを渡すために、この</p> <pre><code>{{ myVariable|cut:"something + templateVariable" }} </code></pre> <p>ような何かをしようとしているカットフィルタ
- 18. 辞書<int、auto-property>をデータソースとしてコンボボックスにバインドする
- 19. 辞書<string, T>がすべてのクエリ文字列パラメータにバインドされないようにする
- 20. は、私は<code>g.CustomerBillId</code>は、既存のロジックに加えて、ヌルを引き戻すことができるようにしたいLINQ文の
- 21. リッチテキスト(FlowDocument?)をビューモデルからRichTextBlockにバインドするにはどうすればよいですか?私はこのようなWinRTの<code>RichTextBlock</code>見にテキストを結合するためにオンラインで見つけることができました
- 22. は、私のような出力をしたいデビット</p> <p>のための信用のためのスタンドと2 1ここでは、このシナリオ
- 23. <iframe>は</p> <p>私は</p> <p>ビデオ、</p> <p>私は再生ボタンをクリックすることができ、埋め込みを見ることができ、ユーチューブのビデオが動作するように-seemsブト
- 24. アシスタント - データベース出力を再構築して、値を検索するための辞書として使用することができます。
- 25. Haskellは、あなたが見ることができるようにモナド
- 26. コンテキストプロセスから渡された辞書オブジェクトを解析しようとしているときに、変数 "%s" >>が見つかりません
- 27. は、ここに示されているよう<code>com.android.support:percent:22.2.0</code>を使用しようと、新たな依存関係(アンドロイドパーセント-サポート)
- 28. 私は、Pythonに新しいですし、現在私が書いて(または書き込みしようとして)いますPythonの2</p> <p>の最新バージョンを使用して...</p> <p>を、私はこれを説明するにはどうすればよい
- 29. HerokuのSSLエラー:<a href="http://www.akadia.com/services/ssh_test_certificate.html" rel="nofollow">http://www.akadia.com/services/ssh_test_certificate.html</a></p> <p>これはsever.keyとをserver.crt作成します。鍵は私がHerokuのは、ここに提案する命令を使用して自己署名証明書を生成しようとしていますPEM証明書
- 30. は、どのように私はビューにデータのidのか何かを設定するために参照することができます</p> <pre><code>Auth::user()->id </code></pre> <p>を有することに、私が使用していますアプリのビューlaravelで
きっとあなたはより多くの '(>> =):: MonadDict mのような何かしたいです - あなたは3を取得する場合> mb'、または何をする予定ですか - >ミリアンペアを - >( - >メガバイト)別の辞書? –
@DanielWagner私はそれを一度しか使用しません。最後に辞書を渡す 'usage'部分を参照してください。 – coubeatczech
通常、「私は1つしか渡しません」のような単純な不変量は、あなたにチェックするために型チェッカーに尋ねるのに良いことです。私が提案したタイプはそうするように求める一つの方法です。 –