問題タブ [monadplus]

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 投票する
3 に答える
2209 参照

haskell - Haskell IO の MonadPlus 定義

ちょっとしたコードを書いていて、IO モナドでガード関数を使いたいと思っていました。ただし、IO 用の MonadPlus の定義がないため、IO ランドではガードを使用できません。MabyeT トランスフォーマーを使用して Maybe Monad でガードを使用し、すべての IO アクションを持ち上げる例を見てきましたが、必要がない場合は実際にはそうしたくありません。

私が欲しいものの例は次のとおりです。

MonadPlus またはそれ以外の宣言を通じて、IO モナドでガード関数 (または同様のもの) を取得する良い方法があるかどうか疑問に思っていました。あるいは、私のやり方が間違っているのかもしれません。上記の関数でそのヘルプ メッセージを記述するより良い方法はありますか? ありがとう。

(PS if-then-else ステートメントを使用できますが、どういうわけかポイントを無効にしているようです。多くのオプションでは、大量のネストが発生することは言うまでもありません。)

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

haskell - Monad `fail` と MonadPlus `mzero` の適切な使い方

これは、設計コード、特にライブラリで何度か出てきた質問です。少し興味があるようですので、良いコミュニティ wiki になるのではないかと思いました。

Monadのfailメソッドは、いぼだと考える人もいます。元の圏論に由来しないクラスへのいくぶん恣意的な追加。しかし、もちろん現在の状態では、多くのモナド型は論理的で有用なfailインスタンスを持っています。

MonadPlus クラスは Monad のサブクラスでありmzero、モナドに失敗の概念を論理的にカプセル化するメソッドを提供します。

したがって、ある種の障害処理を行うモナド コードを書きたいライブラリ設計者は、自分のコードfailで Monad のメソッドを使用するか、自分のコードを MonadPlus クラスに制限するかを選択できmzeroます。彼はモノイド結合mplus操作をまったく気にしません。

この主題に関するいくつかの議論は、MonadPlus クラスを改革するための提案に関するこの wiki ページにあります。


だから私は1つの特定の質問があると思います:

fail自然なメソッドを持っているが、MonadPlus の論理的な実装を持たないために MonadPlus のインスタンスになれないモナドのインスタンスがあればmplus?

しかし、私は主にこの主題に関する議論に興味があります。ありがとう!


編集:最後の考えが1つ浮かびました。私は最近fail(x:xs) <- return []モナドのfail.

言語設計者はfail、Monad に含まれる Haskell の構文に組み込まれた何らかの自動障害処理の可能性に強く影響されたに違いないようです。

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

haskell - Haskell State モナドとモナドガード

状態が関与するモナドコードで命令型ループをエミュレートする小さなタスクがあり、IO がないはずです。タスクは条件付きでループを終了することであり、ここに私の試みがあります:

したがって、ここでは 4 のようなものが得られると期待していますが、代わりに次の不可解なメッセージが表示されます。

全体はガードなしで問題なく動作しますが、何らかの理由で完全にガードが嫌いなようです。

UPD : 最後に、タイプのヒントを提供してくれた hammar のおかげで、実行できるようになりました。何も返さないにもかかわらず、5回実行されることはわかっています。これはクールですが、今のところどのように役立つかわかりません。

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

haskell - MonadPlus (ST a) インスタンスが必要

Typed Logical Variables in Haskellという論文を読んでいますが、最終的な実装の詳細を理解できていません。特に、セクション 4 で導入されたバックトラッキング状態トランスフォーマーです。何らかの理由で、私にはわかりませんが、GHC は、以下の functionに のMonadPlusインスタンスが必要であると考えています。(ST a)unify

何が問題なのか、どのように修正すればよいのかわかりません。ここまでは、前の議論とコードを理解したという印象を受けていましたが、どうやら間違っていたようです。誰かが何がうまくいかないのかを指摘できる場合-MonadPlus (ST a)インスタンスが必要かどうか? - とても参考になります。

[編集: 明確化]著者mzeroは、または のバリエーションmzeroが適切な関数であると主張しているように見えることを指摘しておくべきでした。私は適切な機能が何であるかを知りません。私が疑問に思っているのは、MonadPlus (ST a)インスタンスを作成することになっているのか、それとも正しい関数を使用していないのか、何かを読み違えてしまったのかということです。

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

haskell - Haskell:(MonadPlus m => Bool-> a-> ma)は役に立ちませんか?

codepad.orgを見て回った後、FizzBu​​zzで遊ぶようになり、何らかの機能が必要であることに気づきました。

できるようにmwhen (n /? 3) "Foo" `mappend` mwhen (n /? 5) "Bar"

私はそれがフーグルで上がると思っていましたが、サイコロはありません

これは私が思っているほど便利ではありませんか?

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

haskell - 型クラスMonadPlus、Alternative、Monoidの違いは?

標準ライブラリのHaskell型クラス、、、MonadPlusおよびAlternativeそれぞれMonoidは、本質的に同じセマンティクスを持つ2つのメソッドを提供します。

  • 空の値:mzero、、、emptyまたはmempty
  • a -> a -> aタイプクラスの値を結合する演算子: mplus、、、<|>またはmappend

3つすべてが、インスタンスが準拠する必要があるこれらの法則を指定します。

したがって、3つの型クラスはすべて同じメソッドを提供しているようです。

Alternativeとも提供somemanyますが、通常はデフォルトの定義で十分なので、この質問に関してはそれほど重要ではありません。)

だから、私の質問は:なぜこれらの3つの非常に似たクラスがあるのですか?スーパークラスの制約が異なること以外に、それらの間に実際の違いはありますか?

0 投票する
5 に答える
9110 参照

haskell - 「代替」型クラスの意味と他の型クラスとの関係に混乱している

Typeclassopediaを調べて、型クラスを学習しました。私は理解に行き詰まっていますAlternative(そしてMonadPlus、さらに言えば)。

私が抱えている問題:

  • ペディアによると、「Alternative 型クラスは、モノイド構造も持つ Applicative ファンクター用です。」よくわかりません -- オルタナティブとは、モノイドとはまったく違うものを意味するのではないですか? つまり、Alternative 型クラスのポイントは 2 つのものの間で選択することであると理解していましたが、モノイドはものを組み合わせることであると理解していました。

  • emptyAlternative にメソッド/メンバーが必要なのはなぜですか? 私は間違っているかもしれませんが、まったく使用されていないようです...少なくとも私が見つけたコードでは。そして、それはクラスのテーマに合わないようです.2つのものがあり、1つを選択する必要がある場合、「空」は何のために必要ですか?

  • Alternative 型クラスに Applicative 制約が必要なのはなぜ* -> *ですか? なぜ持っていないの<|> :: a -> a -> aですか?すべてのインスタンスは同じ方法で実装できます...私は(確信が持てません)と思います。モノイドが提供しない価値は何ですか?

  • MonadPlus型クラスのポイントは何ですか? Monad何かを aとの両方として使用するだけで、その良さをすべて解き放つことはできませんAlternativeか? なぜそれを捨てないのですか?(私は間違っていると確信していますが、反例はありません)

願わくば、これらすべての質問が首尾一貫していることを願っています ... !


報奨金の更新: @Antal の回答は素晴らしいスタートですが、Q3 はまだ開いています: Monoid が提供しないオルタナティブは何を提供しますか? この回答は、具体的な例と、Alternative のより高い親切さが Monoid とどのように区別されるかについての具体的な議論がないため、満足のいくものではありません。

Applicative の効果と Monoid の動作を組み合わせる場合は、次のようにしてください。

多くの Monoid インスタンスは Alternative インスタンスとまったく同じであるため、これは私にとってさらに混乱を招きます。

だからこそ、オルタナティブが必要な理由と、それがモノイドとどのように異なるか、または何か異なることを意味するかを示す具体的な例を探しています.

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

haskell - MonadPlus ではなく、Alternative である Monad の例は何ですか?

Edward Kmettは、 「型クラス、、、および?」の違い</a>に対する彼の回答で、次のように述べています。MonadPlusAlternativeMonoid

さらに、Applicativeが のスーパークラスだったとしても、とにかくMonadそのクラスが必要になることになります。MonadPlus

厳密にはそれを証明するのに十分ではありません

したがって、何かが であると主張することは、MonadPlusそれが であると主張することよりも強力ですAlternative

モナドではないAlternativeアプリカティブ・ファンクターは、自動的にではないan の例になることは明らかですが、エドワード・クメットの答えは、 anであるがaではないモナドMonadPlusが存在することを暗示しています。法律。2 この例を自分で思いつくことはできません。誰か知っていますか?AlternativeMonadPlusempty<|>AlternativeMonadPlus


1一連の法則の正規の参照を見つけることができませんでしたが、「Alternative型クラスの意味と他の型との関係に混乱している」という質問への回答のほぼ半分であると思われるものを並べますクラス」</a> (「右分配性」という語句を検索してください)。私が守らなければならないと信じている4つの法則は次のとおりです。Alternative

  1. 右分配 (の<*>):  (f <|> g) <*> a = (f <*> a) <|> (g <*> a)
  2. 右吸収 ( の場合<*>):  empty <*> a = empty
  3. 左分配係数 (のfmap):  f <$> (a <|> b) = (f <$> a) <|> (f <$> b)
  4. 左吸収 ( の場合fmap):  f <$> empty = empty

Alternativeまた、より有用な一連の法律が与えられることも喜んで受け入れます。

2私は法律が何であるかについて曖昧さがあることMonadPlusを知っています。左分布または左キャッチを使用する答えに満足していますが、前者の方が少し好きです。

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

haskell - 失敗した計算を成功した計算に、またはその逆に変換する方法

これは問題を探す解決策かもしれません...もしそうなら、私はあなたの耽溺をお願いします!

可能な実装:

解釈は次のようになります。成功した計算が与えられた場合、それを失敗したものにします。失敗した計算が与えられたら、それを成功させます。よくわかりませんが、これはMonadPlusとは逆のようです...本当に目を細めている場合。???

この概念の標準の型クラスまたはその他の実装はありますか?もしあれば、基礎となる数学はどのように見えるでしょうか(つまり、これは半群、ループなどです)?

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

parsing - モナド変換子パーサーコンビネーターでバックトラックを制限する方法

tl; dr、バックトラックを制限できるパーサーを実装するにはどうすればよいですか?パーサーはモナド変換子スタックです。

このアプローチの論文、ブログ、または実装例は見つかりませんでした。バックトラッキングを制限するための一般的なアプローチは、コンストラクターが追加されたデータ型、またはバックトラッキングがデフォルトでオフになっているParsecアプローチのようです。

私の現在の実装(commitコンビネータを使用、以下を参照)は間違っています。型、型クラスに属しているかどうかはわかりません。私のインスタンスは、本来あるべきと思われるほど一般的ではありません。

誰かがこれをきれいに行う方法を説明したり、私にリソースを教えてもらえますか?

現在のコードを以下に追加しました。投稿が長すぎてごめんなさい!


スタック:

意図は、バックトラッキングが中間層で動作することです-Nothingまたは空のリストは必ずしもエラーを生成しません、それは単に別のブランチを試す必要があることを意味します-一方、最下層はエラーのためのものです(いくつかの文脈で情報)解析をすぐに中止します。

いくつかの構文解析クラス:

それらのインスタンス:

そして、さらにいくつかのコンビネータ:

次に、これらのパーサー:

これらの結果を与える: