問題タブ [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 - Haskell - いくつかの設定ファイルを読み取るプログラムを構築する方法は?
についての紹介によると、ReaderT
次のものしか見つかりません。
そして、それは意味します
したがって、実行順序は次のようになります
これは、私たちのプログラムが環境としていくつかの既存の値を持っていることを要求しますが、ほとんどのプログラムはこれらの環境値をロードする必要があると思いました. データベース URL、デバッグ スイッチャーなどです。
したがって、逆の実行順序があり、Monad スタックによるとこれは違法です。
モナド スタックは次のようになります。
IO
モナドはモナド スタックのベース モナドになれないため、これは不正です。では、外部設定ファイルを使用してプログラムを初期化する適切な方法はありますか?
PS1。プログラムの一部として設定をxmonad
コンパイルすることに気付きました。これが設定を「ロード」する唯一の方法かどうかはまだわかりません...
haskell - モナド変換子にはモナドの内部構造へのアクセスが必要ですか?
モナドトランスフォーマーを書くためにモナドの内部構造にアクセスする必要がありますか?
例: GetT
- Get
Data.Binary.Get からのモナド用トランスフォーマーが必要ですが、このモジュールはモナドの内部を公開しませんGet
。私にとって唯一の方法は、GetT
Data.Binary.Get モジュールに直接追加することでしょうか?
scala - 関数の戻り値の型を (任意の) モナドに指定する方法は?
要するに、次のような特性を宣言したいと思います。
モナドが何であるかを知らなくても使用できるようにA
、次のようにします。
詳細...
基本的に、私は次のようなことをしたい:
関数に変更を加えずに、MonadResultA
または のインスタンスを渡すことができるようにしたかったのです。
欠けている部分は、関数をコンパイルするために以下のようにする必要があると思います。MonadResultB
work
SomeUnknowType
test
work
私が言ったように、私はまだこのモナドのことを学んでいます... 私のコードがそれを行う正しい方法ではないことがわかったら、それを指摘することは大歓迎です~
どうもありがとう~~
scala - Scala はネストされたモナドを単純化する
Lift で記述されたコードがいくつかあります。基本的に入れ子になった Box (Option と同様のモナド) です。できればもう少しシンプルにしたい。できれば型パラメータを追加して、必要に応じて簡単に string または double に変更できるようにします。ここにコードがあります
"tryo" は、例外が発生し、r が Req オブジェクトの場合に結果をキャッチして Box にラップするヘルパー関数です。"param" 関数は Box[String] (リクエスト パラメータから取得) を返します。Int の String などで機能するようにしたいと思います。可能であれば、ネストされた map/openOr (getOrElse は Option 型と考えてください) を取り除きます。
モナドトランスフォーマー?
scala - モナド変換子はサービスからのJSONの取得に適用されますか?
私は遊びを持っています!2外部サービスからJSON形式のデータを取得する必要があるScalaアプリケーションの場合。
遊び!フレームワークでは、応答をPromiseでラップすることにより、HTTPリクエストを非同期で作成できます。Promise
は、将来利用可能になる値をラップするモナドです。
これは問題ありませんが、私の場合、Webサービスから取得するのはJSON文字列です。解析する必要があり、解析が失敗する可能性があります。だから私は私が入るものは何でもラップする必要がありOption
ます。その結果、私のメソッドの多くがを返していPromise[Option[Whatever]]
ます。つまり、Whatever
後で利用可能になる可能性のあるタイプの値です。
今、私がそのような値を操作しなければならないときはいつでも、私はmap
それを2回行う必要があります。私はこれを次のように扱うことを考えていました:
Hope[A]
たとえば、をラップする新しいタイプを作成しますPromise[Option[A]]
- 次のような関連するメソッドを定義します
map
(またはforeach
、コレクションの特性を使用して継承する必要がありますか?)flatten
Promise[Option[A]]
との間の暗黙的なコンバータを提供しHope[A]
ます。
定義するのは簡単ですmap
-2つのファンクターの合成もファンクターです-flatten
この場合、またはでモナドを構成するときはいつでも明示的に行うことができますOption
。
しかし、私がこのようなものを再発明する必要がないことは私の限られた理解です。モナド変換子はまさにこの場合に存在します。または、まあ、私は思う-私はモナド変換器を使用したことがない-そしてこれが質問のポイントです:
この状況でモナドトランスフォーマーを使用できますか?実際にどのように使用しますか?
asynchronous - F#非同期と多分計算式を組み合わせる
ワークフローOption
でしばらく戻りたいとしましょう:async
理想的には、非同期を実行することを避けるために、非同期と同時にFSharpxからの多分計算式を使用しmatch
ます。カスタムビルダーを作成することはできますが、2つの計算式を一般的に組み合わせる方法はありますか?次のようになります。
list - リスト要素を新しい行に出力する
私はリストとモナドと完全に混同しているので、おそらく私の質問は正しくないか、非常に素朴です. ここでmapM_ func を使用してそれを行う方法を見てきました:
しかし、それがどのように機能するのか正確にはわかりません。次のような方法でこれを行う方法を知りたいです:
または、私がそれを正しく理解していれば:
[1, 2, 3] には type が[a]
あり、 print には typeがあることを理解していShow a => a -> IO ()
ます。また、モナド List を使用するList a
には、左側に type が必要であり、右側に func with type が必要であることも理解しa -> List b
ています。私は正しいですか?これで私を助けてもらえますか?
UPD。mapM_ の仕組みを説明してくれた @MathematicalOrchid に感謝します。私の側から説明したいのですが、実際の問題は結果を別の行に出力することではなく、モナド List が提供する方法でいくつかのモナド アクションを実行することです (今は OpenGL のことをぶらぶらしているため)。しかし、誤解の根源はモナドの混合にあることがわかりました。
UPD2。回答ありがとうございます。このようなあいまいな質問で申し訳ありません。必要な答えと質問が何であるかが正確にはわかりません。それは、私がいくつかの基本を理解していなかったからです。そのため、すべての答えには、私が探していたものの小さな平和があるため、「正しい答え」を選択するのは難しいです。私は、私が望んでいたものに最も近いものを選択することにしました (現在は最も有用ではありませんが)。
scala - Scala のパーサーを介して余分な状態をスレッド化する
前もって tl;dr を差し上げます
Scalaz 7の状態モナド トランスフォーマーを使用してパーサーを介して余分な状態をスレッド化しようとしていますが、多くのt m a -> t m b
バージョンのm a -> m b
メソッドを作成しないと何か便利なことを行うのに苦労しています。
解析問題の例
括弧内に数字が入ったネストされた括弧を含む文字列があるとします。
また、新しい変数名 (この場合は文字) のストリームもあります。
ストリームの一番上から名前を取り出し、それを解析するときにそれを各括弧式に割り当て、その名前を括弧の内容を表す文字列にマップし、ネストされた括弧式 (存在する場合) を次のように置き換えます。彼らの名前。
これをより具体的にするために、上記の入力例の出力を次のようにします。
所定のレベルで、数字の文字列または任意の数の部分式のいずれかが存在する可能性がありますが、これら 2 種類のコンテンツが 1 つの括弧内の式に混在することはありません。
簡単にするために、名前のストリームには重複や数字が含まれることはなく、常に入力に十分な名前が含まれていると仮定します。
少し変更可能な状態でパーサーコンビネーターを使用する
上記の例は、この Stack Overflow questionの解析問題を少し簡略化したもの です。私はその質問に、大まかに次のような解決策で答えました。
それほど悪くはありませんが、可変状態は避けたいと思います。
私が欲しいもの
Haskell のParsecライブラリを使用すると、ユーザー状態をパーサーに簡単に追加できます。
これは上記の Scala パーサーをかなり単純に翻訳したものですが、変更可能な状態はありません。
私が試したこと
Scalaz のステート モナド トランスフォーマーを使用して、可能な限り Parsec ソリューションに近づこうとしてParser[A]
いStateT[Parser, Stream[Char], A]
ます。次のように書くことができる「解決策」があります。
これは機能し、ミュータブルな状態のバージョンや Parsec のバージョンよりもそれほど簡潔ではありません。
しかし、私ExtraStateParsers
は罪のように醜いです—私はすでに持っている以上にあなたの忍耐を試したくないので、ここには含めません (ただし、本当に必要な場合はリンクがあります)。上記のand型 ( 、、、および、数えている場合は )に使用するすべてのParser
andParsers
メソッドの新しいバージョンを作成する必要がありました。他のコンビネータを使用する必要があった場合、それらの新しい状態トランスフォーマー レベルのバージョンも作成する必要がありました。ExtraStateParsers
ESP
rep1
~>
<~
|
これを行うためのよりクリーンな方法はありますか?Scalaz 7 のステート モナド トランスフォーマーを使用してパーサーを介して状態をスレッド化する例を見たいと思っていますが、Scalaz 6 または Haskell の例も有用であり、高く評価されます。
haskell - Haskell Applicative Transformer の例
www.haskell.org の wiki では、Applicative Transformer について次のように説明されています。
では、アプリケーション トランスフォーマーはどこにあるのでしょうか。答えは、アプリカティブ ファンクターは一般的な方法で組み合わせることができるため、特別なトランスフォーマーは必要ないということです。 http://www.haskell.org/haskellwiki/Applicative_functor#Applicative_transformers
たくさんのアプリカティブファンクターを組み合わせるために、次のことを試しました。しかし、私が得たのはたくさんのエラーだけでした。コードは次のとおりです。
これにより、多くの型エラーが発生します。部分的には理解できますが、まったく解決できませんでした。
エラーは最後に示します。
たとえば、Maybe Applicative と List Applicative をどのように組み合わせるのですか?
たとえば、State Applicative と List Applicative を組み合わせるにはどうすればよいですか? たとえば、Maybe と List、Maybe と State を組み合わせて、最後にすべての IO と State アプリケーションを組み合わせた例はありますか?
ありがとう。
GHCi エラー メッセージが続きます。
haskell - ListTモナド変換子がバグがあると見なされるのはなぜですか?それが破るモナド法は何ですか?
私はそれについて言及しました
ListT
モナドの法則を満たさないバギーモナド変換子の典型的な例です。
これは簡単な例で示すことができますか?
編集:私の考えListT []
は少し間違っています。ドキュメントでは内部モナドが可換である必要があることを見逃しました。それで、ListT
この要件があるという意味でバグがありますか、それとも別の問題がありますか?(Haskell wikiの例はすべて使用ListT IO
されており、IO
明らかに可換ではありません。)