4

クラスの名前とパーサーでの使用法から、そしてMaybe私はそれが動作するのはから最初の空でない入力を選択することだと思いましたa <|> b <|> c。だから私は入力のためにそれを期待しました

[] <|> [1] <|> [2, 3]

空でない最初のリストを返します。つまり、次のようになります。

[1]

しかし、実際にはすべてを連結して、次のように生成します。

[1,2,3]

だから私はそのような実装の背後にある理由は何ですか?それは実際に正しいですか?

http://hackage.haskell.org/packages/archive/base/latest/doc/html/Control-Applicative.html#t:Alternative

PS私が期待したことを実行する標準機能はありますAlternativeか?

4

4 に答える 4

4

これは意図された動作です。このAlternativeクラスは、適用可能なファンクターのモノイドを定義します(したがって、(Applicative f) =>定義のクラス制約)。

AlternativeApplicativeと同じ関係がMonadPlusありMonadます。リストのインスタンスがリストのインスタンスと同じ動作(およびリストAlternativeのインスタンスと同じ動作)を提供することは理にかなっています。MonadPlusMonoid

ただし、リストモノイドの有効な定義はこれだけではありません。あなたの定義:

instance Monoid [a] where
  mempty = []
  [] `mappend` xs = xs
  xs `mappend` _  = xs

また、モノイドの法則を満たしているので(演習:これをチェックしてください!)、新しいタイプを定義することができます

newtype Lst a = Lst { getLst :: [a] }

それを// MonoidetcAlternativeインスタンスにするか、Daniel Fischerの答えのように、必要なことを実行するための独自の関数を定義します。

于 2013-01-07T12:50:29.827 に答える
4

その理由(まあ、1つのMonadPlus理由)は、インスタンスと一致することです。

私の知る限り、型に両方のインスタンスがあり、MonadPlusとの場合、 toの関係はtoの関係に似ているAlternativeため、これらのインスタンスが一致することが望ましいです。AlternativeApplicativeMonadPlusMonad

希望する動作のために、を使用する場合は、リストAlternativeのラッパーが必要ですnewtype。独立した関数として、もちろん定義も簡単です。

[] <++ xs = xs
xs <++ _  = xs
于 2013-01-07T12:48:57.967 に答える
3

Alternative f(または)インスタンスを実装するときはMonadPlus f、モノイドを選択し、f aとを使用して実装する必要がemptyあり<|>ます。リストなどの一部の構造では、いくつかの可能性があります。リストの最も自然なモノイド操作は、それらの連結です([]ID要素です)。あなたが示唆するように、最初の空でない要素を取ることも可能ですが、リストにとっては自然ではありません。操作はリストの構造(長さ)をほとんど無視し、リストが空かどうかだけをチェックします。そして、この種のモノイド操作は、(非)空の値を表すように設計されたMaybeのインスタンスとしてすでに利用可能であるため、新しいものは何も追加されません。Alternative

MonadPlusこれは、のインスタンスにも反映されます[]HaskellWikiで説明されているように、次のインスタンスには2つの法則がありますMonadPlus

  • Monoid + LeftZero+LeftDistribution-によって統計化[]
  • Monoid + LeftZero + LeftCatch-、、およびによって統計化さMaybeIOますSTM

Alternativeとの実装を選択した場合、LeftDistributionをMonadPlus満たすものはなく、を満たすインスタンスのみがあります。繰り返しになりますが、のは... + LeftCatchのと大差ありません。そして、 send + more=moneyパズルのようなものを解くことができるものは何もありません。したがって、連結する/ ofを選択する方がはるかに興味深いです。MonadPlus[]MonadPlusMaybemplus<|>[]

于 2013-01-07T20:27:08.893 に答える
3

Alternativeは、アプリケーションファンクター用に定義されたモノイドです。したがって、適用可能なファンクターのAlternativeのインスタンスは、モノイドの法則を満たしている場合は正しいです。

それを行うための標準関数があるかどうかはわかりませんが、もちろん、独自の関数を実装したり、代替の独自のインスタンスを定義したりできます。

あなたはtypeclassopediaでそれらについてもっと読むことができます。これは、これらすべての型クラスを、従うべき法則とともに詳細に説明しています。

于 2013-01-07T12:46:19.513 に答える