問題タブ [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 - 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 のインスタンスになるようにする方法はありますか?それとも、各クラスのインスタンスを明示的に記述する必要がありますか? どんな洞察でも大歓迎です、ありがとう!
java - ? のような Java での Null Safe 逆参照。Maybeモナドを使ってGroovyで
Objective C から Java に移植されたコードベースに取り組んでいます。nullcheck を使用しないメソッド チェーンの使用法がいくつかあります。
安全な逆参照演算子?に似たものを探していました。nullchecks の代わりに Groovy で
これにより、Maybe モナドは Null の代わりに Nothing の概念を持つようになりました。しかし、値がアクセスされたときに、私が遭遇した Nothing のすべての実装は例外をスローしますが、それでもチェーンの問題は解決されません。NullObject パターンのように動作するモックを返す Nothing を作成しました。しかし、それはチェーンの問題を解決します。
この Nothing の実装に問題はありますか?
私が見る限り
- コードでモッキングライブラリを使用するのは奇妙に感じます
- 最初のヌルで止まらない。
- null参照または名前が実際にnullであるため、null結果を区別するにはどうすればよいですか? Groovy コードではどのように区別されますか?
haskell - 珍しい型の署名
自然言語セマンティクスのモナドでは、Chung-Chieh Shanが、モナドを使用して、いくつかの異なる種類の自然言語現象(疑問詞、焦点、内包性、および数量化)の標準的な説明をうまく均一に言い換えることができる方法を示しています。彼は、この目的に役立つ2つの合成操作とを定義しA_M
ています。A'_M
1つ目は単純ap
です。べき集合のモナドap
には、非決定論的関数アプリケーションがあります。これは、疑問詞のセマンティクスを処理するのに役立ちます。リーダーモナドでは、拡張構成の通常の分析に対応します。等
意味あり。ただし、2次合成操作には、私には奇妙に見える型注釈があります。
(Shanはそれを呼んでA'_M
いますが、ここでは呼んでい<?>
ます。)定義は、型に期待するものです。それはかなり密接に対応していap
ます:
これが論文の文脈でどのように想定されているかを理解できると思います(疑問詞の質問動詞の処理、内包と外延の役割など)。それが行うことはそれほど複雑ではありませんが、それが以前にHaskellで見たイディオムではないので、ここでそのような中心的な役割を果たすのを見るのは少し奇妙です。
Hoogleでは、m (m a -> b) -> m a -> m b
またはのどちらにも役立つものはありませんm (a -> b) -> a -> m b
。
これは他のコンテキストの人にはなじみがありますか?この関数を書いたことがありますか?
c# - IEnumerable 以外の型 (モナド?) を操作する LINQ クエリ式-- 用途は?
私はTomas Petricek と Jon Skeet によるReal-world Functional Programmingという本を読んでいますが、計算式1) (別名モナド) のセクションを理解するのに苦労しています。
この本を通じて、以前の経験とは対照的に、LINQ クエリ式は に限定されずIEnumerable<T>
、他のカスタム型でも機能することを学びました。これは私にとって非常に興味深いことであり、クエリ式の構文 ( from x in ... select ...
) が適しているシナリオがあるかどうか疑問に思っています。
背景情報:
どうやら、そのようなカスタム型は計算型と呼ばれ、Haskellのモナドと本質的に同じものとして描かれています。私はモナドが何であるかを正確に把握することはできませんでしたが、本によると、それらはbindとreturnと呼ばれる 2 つの操作によって定義されます。
関数型プログラミングでは、これら 2 つの操作の型シグネチャは次のようになります (私が思うに):
はM
モナド型の名前です。
C# では、これは次のようになります。
LINQ Enumerable.Select
(射影演算子) は、バインド操作とまったく同じシグネチャを持っていることがわかりM := IEnumerable
ます。
私のカスタム LINQ 計算タイプ:
この知識を使用して、次のようなカスタム計算タイプを記述できるようになりました IEnumerable
。
Wrapped<T>
これで、LINQ クエリ式で使用できるようになりました。たとえば、次のようになります。
もちろん、この例はあまり役に立ちませんが、クエリ式を作成して、コレクションを操作する以外のことを行う方法を示しています。たとえば、値を何らかの型でラップおよびラップ解除するなどです。
質問:
上記の計算タイプはあまり役に立たないようです。したがって、LINQ クエリ式を利用する (コレクションの処理以外に) 他にどのような合理的な用途があるのでしょうか?
1)セクション 12.4:「代替ワークフローの紹介」、334 ページから。