問題タブ [reader-monad]

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.

0 投票する
1 に答える
5357 参照

scala - Scalaの構成データ-Readerモナドを使用する必要がありますか?

Scalaで適切に機能する構成可能なオブジェクトを作成するにはどうすればよいですか?モナドでトニーモリスのビデオを見ましたが、Readerまだ点をつなぐことができません。

オブジェクトのハードコードされたリストがありClientます:

Client.clientsプロパティファイルまたはデータベースから読み取る柔軟性を備えた、実行時に決定されることを望んでいます。Javaの世界では、インターフェイスを定義し、2種類のソースを実装し、DIを使用してクラス変数を割り当てます。

これは私にはかなりクリーンな解決策のように見えますが(多くのコードではなく、明確な意図)、それvar 飛び出します(OTOH、それは一度だけ注入されることを知っているので、私にはそれほど面倒はないようです-一度)。

この状況でモナドはどのように見えるでしょうReaderか。私が5歳のように説明すると、その利点は何ですか。

0 投票する
2 に答える
361 参照

haskell - 関数合成のヒント

次の構成がどのように機能するかについての説明を探しているだけです。

どこ

最終的なタイプ:

ma(a-> mb)とどのように一致させることができるか理解できません。関数型を期待する(= <<)の最初の引数に単純型であるreturnの結果をどのように適用できますか?

0 投票する
2 に答える
142 参照

scala - モナドリーダーでイテレータオブジェクトに関数適用した最新の結果だけを返す方法

私の問題をこの少し「単純化しすぎた」例に置き換えます。目的は、反復子オブジェクトの各要素に対する単純な関数の実行に基づいて、最新の計算のみを返すことです。

このリストでは、反復子の評価が '8' を返すようにします

を試してみましたyieldが、そのような2つのことを計算できないようです:

したがって、評価された最新の要素のみを保存するための解決策がありますがmapslice同僚との議論の後、これは実際には美しい関数コードに準拠していないようであり、それを行うためのより良いアプローチがあります (本当に?)。

これに基づいて、リストのすべての要素に対して関数を反復して計算したいのですが、最新の計算のみが返されます。

編集:私の例は「単純化しすぎ」です。この間違いをお詫びします。

実際には、myPersonallMultiply 関数と同等であり、現在の状態または以前の状態を計算する必要があるシミュレーションの実行と同等です。

私のシミュレータの states 関数は state のイテレータを返します:

この状態 (私のシミュレーションのステップ = 1 状態) のそれぞれを計算すると、結果をどこにでも保存/書き込む必要があるため、シミュレーションの実行を Writer クラス (ここでは「CSVwriter」) にカプセル化します。

1 - ご覧のとおり、ここでは、各ステップで前の状態は必要ありませんが、非常に近い将来、これが当てはまります。たとえば、シミュレーションで都市間の新しい交換を計算するには、状態 T が必要です。前の状態 T-1 で作成された交換機にアクセスするには

2 - シミュレーションのスコアを計算するために最後の状態を返す必要があるため、CSVWriter クラスが s.states によって返される各状態を書き込み、計算された最後の状態も返す必要があります。

3 この問題に対して、より優れた、より一般的な解決策を作成することは可能だと思います。おそらく、reader monad状態反復子のこの複雑なライターの動作のためのより良いインターフェイスを作成するのに役立つ可能性がありますが、おそらく私は間違っていますか?

私の質問がより明確になることを願っています。

いくつかの調査の後、機能パターンを見つけましたmonad readerが、このアプローチの関心をグローバルに理解している場合、Webで読んだ別の例をどのように翻訳できるかわかりません(ここの最初の例のようにhttp://mergeconflict.com /reading-your-future/ ) をこの単純な問題に当てはめます。現時点では成功せずに別のコードを試しています:/

「モナドリーダー」を理解するのに役立つ簡単な説明や指針はありますか?

または、おそらく私は完全に間違っており、このアプローチで問題を解決できませんか?

0 投票する
3 に答える
37212 参照

haskell - リーダーモナドの目的は何ですか?

リーダーモナドはとても複雑で役に立たないようです。JavaやC++のような命令型言語では、私が間違っていなければ、リーダーモナドに相当する概念はありません。

簡単な例を挙げて、これを少し明確にしていただけますか?

0 投票する
1 に答える
1289 参照

scala - scalaでMonad Transformersを使用して階段を上るのを避けるには?

構成にモナドを使用する次のコードがありReader、対処する必要があり、関数IO[Option[String]]で階段を上るコードになってしまいました。encode

関数の醜いネストされた内包表記を回避するためReaderに、モナド変換子を定式化するにはどうすればよいですか?OptionTforencode

ありがとうございました!

0 投票する
2 に答える
608 参照

clojure - Clojureのリーダーモナドと部分関数の違いは何ですか?

Leonardo Borges は、Clojure のモナドに関する素晴らしいプレゼンテーションをまとめました。その中で彼は、次のコードを使用してClojure のリーダー モナドについて説明しています。

これの利点は、純粋に機能的な方法で環境から値を読み取ることです。

しかし、このアプローチは Clojure の部分関数に非常によく似ています。次のコードを検討してください。

私の質問は次のとおりです。リーダー モナドと Clojure の部分関数の違いは何ですか?

0 投票する
1 に答える
148 参照

haskell - QuickCheck / monadicIO で Reader モナドを使用する

QuickCheck / を利用する Haskell プログラムに CLI 引数として整数を渡したいと思いますmonadicIO。その整数はassert、テストをカスタマイズ可能にするために内部で使用されます。問題は、 の整数値を解析するmainmonadicIOIORef. Reader洗練された解決策はモナドかもしれないと思いますが、それを機能させるための解決策を見つけることができませんでしquickCheckた。何か案は?

後で編集1:要求に応じて、これを試して失敗している実際のコードを添付しています。コメントアウトされた行は、失敗した試みを表しています。背景: このテスト スイートは、QuickCheck によって生成されたランダム化された入力の SHA512 を計算する非常に単純なリモート エンドポイントを実行することを目的としています。リモート エンドポイントは Python/Flask ベースです。

@ user2407038 に応じて後で編集 2:propHasExpectedLengthCeiling Int 型の追加の引数を取ることができますが、quickCheckランダムな値が生成されますが、それは私が望んでいることではありません。私の目標はmaxSegmentLengthCeiling、コマンド ライン引数から取得した を使用し、それをブロックlet testPassed = actualMaxSegmentLength <= maxSegmentLengthCeiling内で使用することです。monadicIO現在maxSegmentLengthCeiling、最上位の値として指定されているため、値を変更するたびにコードを再コンパイルする必要があります。IORefこれは最後の手段であり、私の質問の本質はIORefルートを回避する方法であるため、関連するコードはまだありません。

0 投票する
1 に答える
448 参照

haskell - 使い方は知っているが、それがどのように機能するのか正確には理解できない (Reader モナド)

次のコードを検討してください (明らかな部分は省略しています)。

「ask」はどのように文字列パラメーターを取得しますか? 型宣言のため、それは私の理解です

関数 'calculateContentLength' には戻り値の型 (Reader String Int 型) がありますが、入力引数はありません。関数自体は、runReader 関数に渡される 2 つの引数の 1 つにすぎないことはわかっていますが、runReader の 2 番目のパラメーターである「s」は、「calculateContentLength」内の「ask」にどのように結び付けられるのでしょうか?

つまり、「calculateContentLength」は、「ru​​nReader」で渡された 2 番目の引数についてどのように「認識」(およびアクセス) するのでしょうか?