問題タブ [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.
ruby - Rubyで同等のモナド
Rubyではモナドの同等の構成は何でしょうか?
haskell - Haskellと乱数
私は数日Haskellをいじっていて、問題に遭遇しました。
整数のランダムリストを返すメソッドが必要です(Rand [[Int]])。
そこで、タイプを定義しました:type Rand a = StdGen -> (a, StdGen)
。なんとかRand IO Integer
してRand [IO Integer]
( )制作できました。(returnR lst) :: StdGen -> ([IO Integer], StdGen)
制作のヒントはありますRand [[Int]]
か?
design-patterns - 野生のモナドトランスフォーマーに遭遇した人はいますか?
私のビジネス分野 (金融機関のバック オフィス IT) では、ソフトウェア コンポーネントがグローバルな構成を保持し、その進行状況をログに記録し、ある種のエラー処理や計算の短絡を行うことは非常に一般的です。 Haskell の Reader、Writer、Maybe モナドなどでうまくモデル化でき、モナド変換子と一緒に構成できます。
しかし、いくつかの欠点があるようです: モナド変換子の背後にある概念は非常にトリッキーで理解しにくく、モナド変換子は非常に複雑な型シグネチャにつながり、パフォーマンスにいくらかのペナルティを課します。
だから私は疑問に思っています:上記の一般的なタスクを扱うとき、モナド変換子はベストプラクティスですか?
haskell - mtl、トランスフォーマー、monads-fd、monadLib、および選択のパラドックス
Hackage には、モナド変換子用のパッケージがいくつかあります。
- mtl : モナド変換ライブラリ
- トランスフォーマー: 具体的なファンクターとモナドのトランスフォーマー
- monads-fd : 機能依存関係を使用するモナドクラス
- monads-tf : 型ファミリーを使用したモナドクラス
- monadLib : モナド変換子のコレクション。
- mtl-tf : 型ファミリーを使用したモナド変換ライブラリ。
- mmtl : Modular Monad Transformer ライブラリ
- mtlx : 型インデックスを持つ Monad 変換ライブラリで、「無料」のコピーを提供します。
- compose-trans : 構成可能なモナド変換子
(そして多分私はいくつかを逃した)
どちらを使用しましょうか。
mtl は Haskell Platform のものですが、reddit ではクールではないという声をよく耳にします。
しかし、とにかく選択の何が悪いのか、それは良いことだけではありませんか?
たとえば、 data-accessor の作成者が、一般的な選択肢だけに対応するために、これらすべてを作成する必要があることを見てきました。
- data-accessor-monadLib ライブラリ: monadLib のモナドのアクセサ関数
- data-accessor-monads-fd ライブラリ: Accessor を使用して monads-fd State モナド クラスの状態にアクセスします
- data-accessor-monads-tf ライブラリ: Accessor を使用して monads-tf State モナド型ファミリの状態にアクセスします
- data-accessor-mtl ライブラリ: Accessor を使用して mtl State モナド クラスの状態にアクセスします
- data-accessor-transformers ライブラリ: Accessor を使用して変換器の状態にアクセスする State モナド
これが続けば、たとえばいくつかの競合する Arrow パッケージが進化すると、次のようなものが表示されるのではないかと想像します。
そして、spoonklink が fork されると、Hackage がディスク容量を使い果たしてしまうのではないかと心配しています。:)
質問:
- モナド変換パッケージがこれほど多いのはなぜですか?
- mtl がクールでないのはなぜですか?
- 主な違いは何ですか?
- これらの一見競合するパッケージのほとんどは、Andy Gill によって作成され、Ross Paterson によって保守されています。これは、これらのパッケージが競合するのではなく、何らかの形で連携するということですか? Andy と Ross は、独自のパッケージのいずれかを時代遅れと見なしていますか?
- あなたと私はどちらを使うべきですか?
haskell - Haskell のモナドは、非表示の状態パラメーターを使用して返すものと考えることができますか?
Haskell のモナドの背後にある正確な代数と理論を理解していません。しかし、一般的に関数型プログラミングについて考えると、初期状態を取得し、次の状態を表すためにそのコピーを生成することによって状態がモデル化されるという印象を受けます。これは、あるリストが別のリストに追加される場合に似ています。どちらのリストも変更されませんが、3 番目のリストが作成されて返されます。
したがって、モナド操作を暗黙的に初期状態オブジェクトをパラメーターとして取り、暗黙的に最終状態オブジェクトを返すと考えるのは有効ですか? これらの状態オブジェクトは、プログラマーがそれらについて心配したり、アクセス方法を制御したりする必要がないように隠されます。したがって、プログラマーは 10 分前の IO ストリームを表すオブジェクトをコピーしようとはしません。
つまり、次のコードがある場合:
... IO モナドと "do" 構文を、このスタイルのコードを表すものと考えてよろしいですか?
performance - Haskellのボックス化されていない配列をループするパフォーマンス
まず第一に、それは素晴らしいです。しかし、ベンチマークが奇妙な結果をもたらす状況に遭遇しました。私はHaskellを初めて使用しますが、可変配列とモナドで手を汚すのはこれが初めてです。以下のコードは、この例に基づいています。
for
範囲ではなく数値とステップ関数を受け取る一般的なモナディック関数を作成しました(のようforM_
に)。ジェネリックfor
関数(ループA)を使用することと、同等の再帰関数(ループB)を埋め込むことを比較しました。ループAを使用すると、ループBを使用するよりも著しく高速になります。奇妙なことに、ループAとBの両方を一緒に使用すると、ループBを単独で使用するよりも高速になります(ただし、ループAを単独で使用するよりもわずかに遅くなります)。
矛盾について私が考えることができるいくつかの可能な説明。これらは単なる推測であることに注意してください。
- Haskellがモナディック関数から結果を抽出する方法について私がまだ学んでいないこと。
- ループBは、ループAよりもキャッシュ効率の低い方法でアレイに障害を発生させます。なぜですか。
- 私はばかげた間違いをしました。ループAとループBは実際には異なります。
- ループAとループBのいずれかまたは両方がある3つのケースすべてで、プログラムは同じ出力を生成することに注意してください。
これがコードです。ghc -O2 for.hs
GHCバージョン6.10.4を使用してテストしました。
haskell - do表記は「base:GHC.Base.Monad」に固有のものですか?
標準Monad
クラスには欠陥があり、実際に拡張する必要がある、Functor
またはPointed
浮かんでいるという考え。
私は必ずしもそれが正しいことだと主張しているわけではありませんが、誰かがそれをやろうとしていたとします:
これまでのところは問題ありませんが、do 表記法を使用しようとすると、次のようになります。
コンパイラは不平を言います:
質問:
do 表記は に対してのみ機能しbase:GHC.Base.Monad
ますか? Monad
代替クラスで動作させる方法はありますか?
追加のコンテキスト:
私が本当にやりたいことはbase:Control.Arrow.Arrow
、「一般化された」Arrow
クラスに置き換えることです。
そしてArrow
、クラスで の proc 表記を使用Arrow
しますが、上記の do 表記と の例のように失敗しますMonad
。
現在のクラスのような型コンストラクターではなく、主Either
にペア型コンストラクターとして使用します。これにより、私のおもちゃの RTS ゲーム ( ) のコードをよりきれいにすることができるかもしれません。(,)
Arrow
cabal install DefendTheKind
haskell - IO 出力をリストに収集する
SDL.pollEvent :: IO Event
出力が完了するまで複数の呼び出しを発行SDL.NoEvent
し、すべての結果をリストに収集するにはどうすればよいですか?
命令的に言えば、次のようなものです。
haskell - Haskellでの明示的な再帰の回避
次の単純な関数は、指定されたモナディック関数をNothingに達するまで繰り返し適用し、その時点で最後のNothing以外の値を返します。それは私が必要とすることを行い、私はそれがどのように機能するかを理解しています。
Haskellでの独学の一環として、可能な限り明示的な再帰を避けようとしています(または少なくともその方法を理解しています)。この場合、単純で非明示的に再帰的な解決策があるはずですが、私はそれを理解するのに苦労しています。
のモナディックバージョンのようなものは必要ありませんtakeWhile
。これは、Nothingより前の値をすべて収集するのに費用がかかる可能性があり、とにかくそれらを気にしないためです。
Hoogleの署名を確認しましたが、何も表示されません。ここm (Maybe a)
ではモナド変換子が役立つかもしれないと少し思わせますが、詳細を考え出すのに必要な直感はまだありません。
おそらく、これを行うのは恥ずかしいほど簡単であるか、それができない、またはできない理由を理解するのは恥ずかしいほど簡単ですが、私が教育戦略として自己恥ずかしさを使用したのはこれが初めてではありません。
更新:もちろん、使用する代わりに述語を提供することもできます:(述語が真である最後の値を返す)のMaybe
ようなものも同様に機能します。(a -> Bool) -> (a -> m a) -> a
私が興味を持っているのは、標準のコンビネータを使用して、明示的な再帰なしでどちらかのバージョンを作成する方法です。
背景:コンテキストの簡略化された作業例を次に示します。単位正方形内のランダムウォークに関心があるとしますが、出口のポイントのみを考慮します。次のステップ関数があります。
のようなものevalState (lastJustM (randomStep 0.01) (0.5, 0.5)) <$> newStdGen
は、新しいデータポイントを提供します。
haskell - Haskell での型クラスのリンク/結合
次のように定義された 2 つの型クラスがあり、機能は同じですが名前が異なるとします。
これら 2 つのクラスを結び付けて、PhantomMonad のインスタンスが自動的に Monad のインスタンスになるようにする方法はありますか?それとも、各クラスのインスタンスを明示的に記述する必要がありますか? どんな洞察でも大歓迎です、ありがとう!