問題タブ [monad-transformers]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - モナド構成を変換子として抽象化する
質問が少し些細なことのように思われる場合は申し訳ありません...それは私のためではありません。私は喜んで次のモナドを作成しました:
これは、よく振る舞うモナドです。ReaderT はモナド変換子であり、State は State モナドであり、AlgRO と AlgState は、それぞれ変更可能な状態と読み取り専用の状態を表す i でパラメータ化されたデータ型です。さて、それを newtype を持つきちんとしたモナド変換子にしたい場合は、次のようになります:
どうすればいいですか?bind メソッド (Monad 型クラスの) をまとめることさえできず、ましてや "lift" (MonadTrans の) をまとめることさえできません... 自動導出が役立つと思いますが、この場合にどのように機能するかを理解したいと思います。
前もって感謝します。
haskell - Haskell でマルチチャネル Writer モナドを実装するより良い方法はありますか?
問題:
同じ Haskell モナド トランスフォーマー スタックで異なる型のライター モナドを構成する必要があります。デバッグ メッセージの書き込みに使用tell
する以外に、他のデータ タイプ (たとえば、他のコンテキストで送信されるデータ パケット) の書き込みにも使用したいと考えています。
チャネライズド ライター モナドの Hackage を確認しました。私が見つけたいと思っていたのは、複数のデータ型をサポートするライターのようなモナドで、それぞれがrunWriter
結果の個別の「論理」チャネルを表しています。私の検索では何も見つかりませんでした。
解決策の試み 1:
問題を解決するための私の最初のアプローチは、WriterT
次の行に沿って 2 回スタックすることでした。
ただし、とMStack
の両方のインスタンスとして宣言するときに問題が発生しました。MonadWriter [Packet]
MonadWriter [String]
ghci からのその後の苦情:
ここに示すように、このアプローチが有効ではない理由は理解していますが、基本的な問題を回避する方法を理解できなかったため、完全に放棄しました。
解決策の試み 2:
スタックには1 つしか存在しないように見えるのでWriterT
、ラッパー タイプを使用して、ユーティリティ関数 ( 、、およびPacket
以下) でその事実を隠しています。機能する完全なソリューションは次のとおりです。String
runMStack
tellPacket
tellDebug
ええ、コンパイルして動作します!
解決策の非試行 3:
また、実際のアプリケーションのトランスフォーマー スタック タイプに存在する必要があるエラー、リーダー、および状態モナド機能も含めて、自分で作成する時期になるのではないかと思いました。私はこれを試みませんでした。
質問:
解決策 2 は機能しますが、より良い方法はありますか?
また、可変数のチャネルを持つチャネル化されたライター モナドは、パッケージとして一般的に実装できますか? それは便利なことのように思えますが、なぜまだ存在しないのだろうと思っています。
haskell - MonadPlus (ST a) インスタンスが必要
Typed Logical Variables in Haskellという論文を読んでいますが、最終的な実装の詳細を理解できていません。特に、セクション 4 で導入されたバックトラッキング状態トランスフォーマーです。何らかの理由で、私にはわかりませんが、GHC は、以下の functionに のMonadPlus
インスタンスが必要であると考えています。(ST a)
unify
何が問題なのか、どのように修正すればよいのかわかりません。ここまでは、前の議論とコードを理解したという印象を受けていましたが、どうやら間違っていたようです。誰かが何がうまくいかないのかを指摘できる場合-MonadPlus (ST a)
インスタンスが必要かどうか? - とても参考になります。
[編集: 明確化]著者mzero
は、または のバリエーションmzero
が適切な関数であると主張しているように見えることを指摘しておくべきでした。私は適切な機能が何であるかを知りません。私が疑問に思っているのは、MonadPlus (ST a)
インスタンスを作成することになっているのか、それとも正しい関数を使用していないのか、何かを読み違えてしまったのかということです。
scala - scalaz List[StateT].sequence - パラメータ n の暗黙の値が見つかりませんでした: scalaz.Applicative
Scalaz ステート モナドの例の回答へのコメントに基づいて、StateT
2 つのステート トランスフォーマーを組み合わせる方法を見つけようとしています。State
私は非常に近いようですが、申請しようとしたときに問題が発生しましたsequence
。
だから私はStateT[StateMap, Random, Int]
、最初のランダムで空のマップ状態でアンラップできるものを持っているところまで行きました:
StateT
ここで、それらのリストを生成して使用sequence
し、 を呼び出せるようにしたいと思いますlist.sequence ! new Random(1L) apply Map[Int,Int]()
。しかし、これを試してみると、次のようになります。
何か案が?可能であれば、最後のストレッチに多少の助けを借りることができます。
haskell - Happstack でデータベース モナド スタックを作成するには?
データベースへのアクセスが多い Happstack アプリケーションを作成したいと考えています。一番下にIOがあり、一番上にデータベース書き込みのようなモナド(真ん中にログライターがある)を持つモナドスタックは、各アクセスで明確な機能を持つように機能すると思います。例:
と:
しかし、私は Monad と Monad Transformers についてほとんど知識がなく (この質問はそれについて学ぶための演習だと思います)、Database Monad の作成を開始する方法、IO を happstack から Database Stack に持ち上げる方法もわかりません。 ...等。
scala - 理解のためのモナド変換子
検討:
今、私は次のようなメソッドを書きます:
ただし、推測される型はOption [Option [Long]]であるため、もちろんこれはコンパイルされません。
Scala構文と標準ライブラリに関してOption[Long]を取得する方法はありますか?パターンマッチングができることは知っていますが、理解のためにそれを使用して実行できるかどうかという疑問が生じただけです。
答えてくれたtenshiに感謝します、それは仕事をします、しかし私はちょうど私の問題の別の例に遭遇しました:
a
for asとして追加できます:a <- Some(A(c))
しかし、暗黙的にはどうですか?それは私のコードの設計変更を意味する必要がありますか?
parsing - 基礎となる Parsec モナド
私が使用する Parsec コンビネータの多くは、次のようなタイプです。
CharParser
ここでは次のように定義されています。
CharParser
したがって、 は を含む型シノニムでGenParser
あり、それ自体は次のように定義されています。
GenParser
は、別の型シノニムであり、 を使用して割り当てられ、次のようParsec
に定義されます。
Parsec
の部分的な適用も同様であり、タイプとともにここにParsecT
リストされています。
言葉とともに:
「ParsecT suma は、ストリーム型 s、ユーザー状態型 u、基礎となるモナド m、および戻り型 a を持つパーサーです。」
基礎となるモナドは何ですか?特に、CharParser
パーサーを使用するとどうなりますか? スタックのどこに挿入されているかわかりません。あいまいなパーサーから複数の成功した解析を返すために、Haskell のモナド解析でリストモナドを使用することとの関係はありますか?
performance - モナド トランスフォーマー ベンチマークからの奇妙な結果。バグ?
私はいくつかの Criterion ベンチマークを実行して、モナド スタック上でコードを実行することによって失われるパフォーマンスを推定しました。結果はかなり興味深いものでした。おそらく、ベンチマークで怠惰の落とし穴に出くわしたことでしょう。
ベンチマークによると、 を使用していない場合でも、WriterT String IO
実行は plain の実行よりも 20 倍 (!) 遅いことがわかります。奇妙なことに、スタックすると5 倍遅くなります。これはおそらく私のベンチマークのバグです。ここで何が間違っていますか?IO
tell
WriterT
ReaderT
ContT
ベンチマーク
結果
haskell - Haskell ReaderT Env IO ボイラープレート
私は非常に頻繁に行う次のボイラープレートを持っており、削除したいと考えています。次のようになります。
それを次のように減らしたいと思います。
残念ながら、モナド変換子についてはまだ完全には理解できていません。の型はfind
何ですか? ですか(Config -> IO Result) -> Result
?どうやって書くの?
モナドトランスフォーマーをgrokするのに役立つヒント/説明は大歓迎です。
ありがとう!
haskell - このモナド変換子を継続して実装するにはどうすればよいですか?
モチベーション。私はモナド変換子を作成しようとしています。これは、「、f <||> g
を含むこのブロック全体をf <||> g
、1回f
は、、次はを含む」という意味の特別な命令を使用して作成していg
ます。他のアプリケーションを想像することはできますが、これはDSL変換を目的としています。
使用例。モナドは、computation
さまざまな可能な選択肢(この場合は印刷するもの)を表します。このprintme
関数は、それぞれの異なる結果をどう処理するかを示します。この場合、実行前に「計算の開始」を出力し、実行後に「---」を出力します。
出力は次のとおりです。
質問。ある種の継続渡しスタイルのモナド変換子を使用して上記の動作を実現するためのクリーンな方法はありますか?Oleg et al。の「モナド変換子のバックトラッキング、インターリーブ、および終了」の論文を見ましたが、それらの実装を完全に把握することはできません(msplit
継続して実装に到達すると)。
現在の実装。私の現在の実装は、行われる分岐決定のリストを渡すことです。モナドは実際に選択したブランチのリストを返し、次に可能な最後のブランチを切り替えます。コードは次のとおりです(7.0.3で実行する必要があります)。