問題タブ [monads]
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で隠された方法で状態を初期化するにはどうすればよいですか(PRNGのように)?
私は State モナドに関するいくつかのチュートリアルを経て、アイデアを得たと思います。
たとえば、この素敵なチュートリアルのように:
OK、getRandom を使用できます。
しかし、PRNG を呼び出すたびにシードを PRNG に渡す必要があります。Haskell 実装で利用可能な PRNG はそれを必要としないことを私は知っています:
ほとんどのチュートリアルで見られるのは「永続的な」状態ではなく、状態をスレッド化するための便利な方法であるように見えるため、おそらく State モナドを誤解していました。
それで... Random モジュールのように、自動的に初期化される状態 (時間やその他のあまり予測できないデータを使用する関数から可能) を取得するにはどうすればよいでしょうか?
どうもありがとう!
haskell - Haskell: モナドの takeWhile?
Haskell から呼び出す C で記述された関数がいくつかあります。これらの関数は を返しIO (CInt)
ます。戻り値に関係なく、すべての関数を実行したい場合がありますが、これは簡単です。サンプルコードのために、これは現在何が起こっているかの一般的な考えです:
望む副作用が得られ、結果は気にしません。しかし、ここでは、目的の結果を返さない最初の項目の直後に実行を停止する必要があります。戻り値が 4 以上の場合、実行を停止する必要があるとしましょう。その場合、私がやりたいことは次のとおりです。
これは私にこのエラーを与えます:
そして、それは私には理にかなっています-結果はまだ IO モナドに含まれており、IO モナドに含まれている 2 つの値を単純に比較することはできません。これがまさにモナドの目的であることを知っています-結果を連鎖させ、特定の条件が満たされたときに操作を破棄します-しかし、この場合、IOモナドを「ラップ」して、条件でチェーンの実行を停止する簡単な方法はありますか?のインスタンスを記述せずに、私の選択のMonadPlus
?
f
takeWhileの目的で、 から値を「持ち上げる」ことはできますか?
これは、ファンクターが適合するソリューションですか? ファンクターはまだ「クリック」していませんが、これはファンクターを使用するのに良い状況かもしれないという印象を持っています。
アップデート:
@sth は私が望むものに最も近い答えを持っています - 実際、それは私が目指していたものとほぼ同じですが、明示的に再帰的でない標準的な解決策があるかどうかを知りたいです - これは Haskell です。全て!質問の言い方を振り返ってみると、自分が望んでいる行動について十分に明確ではなかったことがわかります。
上記f
の例で使用した関数は、単なる例です。実際の関数は C で記述されており、その副作用のみに使用されます。mapM_ f (takeWhile (<4) [0..5])
実行されるまで、入力が実際に成功するか失敗するかがわからないため、@Tomの提案を使用できません。
返されたリストも実際には気にしません。リストが使い果たされるか、最初の C 関数が失敗コードを返すまで、C 関数を呼び出したいだけです。
C スタイルの擬似コードでは、私の動作は次のようになります。
繰り返しますが、@ sthの回答は、結果が破棄される可能性がある(すべきか?)ことを除いて、私が望む正確な動作を実行します。関数は私のdropWhileM_
目的と同等です。なぜそのような関数やtakeWhileM_
Control.Monad にないのですか? メーリング リストで同様の議論があったようですが、それについては何も語られていないようです。
syntax - Haskell: バインド演算子 (>>=) を含むブロックの後に where 句を使用できますか?
とても簡単な質問があります。bind 演算子を使用するコード ブロックの後に where 句を使用したいのですが、コンパイル エラーが発生します。
簡単な例を次に示します。
次のように、list' に let 句を使用できます。
しかし、where句を使用できれば本当にいいのですが...
私もdo表記で試しました
同じ問題。このような状況で where 句を使用できますか?
haskell - データ構造にネストされたモナド内の値?
Haskell プログラムに、次のような型のデータがあるとします。
IO [ IO (Int, String, Int) ]
、 またIO [ (Int, String, IO Int) ]
、 また[ (Int, String, IO Int) ]
しかし、私は で動作するべき純粋な関数を持ってい[ (Int, String, Int) ]
ます。IO [ (Int, string, Int) ] のようなものが得られるまで、IO モナドから内部の値を不器用に削除し、(IO モナドの内部から) 純粋な関数を適用する必要があるようです。これを行うための事前に定義された簡単な方法はありません。データ構造全体をモナドに持ち上げ、内部のすべての型を純粋な型に変えるものはありますか? (それはとても便利です!)
c# - C# での多分モナドと拡張メソッドの悪用?
edit 2015この質問とその回答は、もはや関連性がありません。null伝播演算子(?.)を持つC#6の出現前に質問されました。これにより、この質問とその後の回答で説明されているハックな回避策が不要になります。2015 年以降、C# では Form.ActiveForm?.ActiveControl?.Name を使用する必要があります。
私は .NET での null 伝播の問題について考えていました。これは、次のような醜いコードの繰り返しにつながることがよくあります。
試行 #1 通常のコード:
Maybe<T> モナド、または何らかの「if not null」拡張メソッドの使用について、StackOverflow でいくつかの議論がありました。
試み #2、拡張方法:
私はこれが良いと思いますが、「IfNotNull」とラムダが繰り返されると、構文が少し乱雑になります。私は今、このデザインを検討しています:
試行 #3、拡張メソッドを使用した Maybe<T>
私の質問は次のとおりです:これは拡張メソッドの悪用ですか? 古い通常のヌルチェックよりも優れていますか?
haskell - 一部の Haskell コードの簡素化
そこで私はチェッカーのようなゲームのミニマックスの実装に取り組んでおり、Haskell をよりよく学べるようにしています。私が問題を抱えている関数は、ゲームの状態のリストを取得し、直後の後続のゲームの状態のリストを生成します。チェッカーと同様に、ジャンプが利用可能な場合、プレーヤーはジャンプする必要があります。複数ある場合は、プレイヤーが選択できます。
ほとんどの場合、これは list モナドとうまく機能します: すべての入力ゲーム状態をループし、ジャンプできるすべてのビー玉をループし、そのビー玉のすべてのジャンプをループします。このリストモナドは、最後にすべてのリストを単純な状態のリストにうまくフラット化します。
トリックは、特定のゲーム ステートでジャンプが見つからない場合、空のリストではなく、現在のゲーム ステートを返す必要があるということです。以下のコードは、私が思いついた最良の方法ですが、私には本当に醜いようです。それをきれいにする方法について何か提案はありますか?
編集: *Hex 関数の型シグネチャの例を提供します。
monads - 純粋関数型プログラミング言語における副作用のメソッド
現時点では、副作用を純粋な関数型プログラミング言語に統合する次の方法を認識しています。
- 効果システム
- 続き
- ユニークなタイプ
- モナド
モナドは、これを行うための最も効果的で最も一般的な方法であるとよく言われます。
他にどのような方法がありますか? それらはどのように比較されますか?
haskell - State モナドを使うのと、状態を再帰的に渡すのとではどちらが良いですか?
私は Haskell を学んでいて、視線アルゴリズムを実装する最も慣用的な方法を見つけようとしています。
私が見つけたデモ コードは状態モナドを使用していますが、状態を再帰的に渡す方が簡単なように思えます (私は単なる初心者です)。ここで何が欠けていますか?パフォーマンスの問題はありますか?
コードの検索: http://www.finalcog.com/bresenham-algorithm-idiomatic-haskell
ありがとう、
クリス。
.net - C# で SelectMany を追加すると linq が新しいモナド型に拡張されますが、VB.net で同じことを行うにはどうすればよいですか?
モナドを説明するYet Another Language Geekの古いブログ投稿では、linq構文を新しい型に拡張するためにC#にSelectMany拡張メソッドを追加する方法について説明しています。
C#で試してみましたが、うまくいきました。VB.net に直接変換しましたが、動作しません。VB.net がこの機能をサポートしているかどうか、またはその使用方法を知っている人はいますか?
動作する C# コードは次のとおりです。
動作しない VB.net コードを次に示します (注: vs2010 で記述されているため、一部の行の継続が欠落している可能性があります)。
arrays - mapM のようなものですが、配列用ですか? (arrayMap と同様ですが、不純な関数をマッピングします)
mapArray を使用して可変配列に関数をマップできることがわかりましたが、mapM (および mapM_) のようなものはないようです。mapArray では、その要素を出力できません。次に例を示します。
結果は次のようになります。
Haskell (または、標準の Haskell でなくても GHC) にそのようなものはありますか?
また、配列用のfoldr/foldl関数が見つかりませんでした(変更可能かどうかに関係なく)。それらは存在しますか?
どうもありがとう!