2011-08-26 5 views
28

私はHaskellライブラリ内のApplicativeクラスを見て、Alternativeを見つけました。ハスケル - Control.Applicativeとは何か?

このクラスは何に適していますか? Googleの検索では、特に洞察力のあるものは明らかにされませんでした。それはApplicativeパッケージと同じようにバンドルされているようです。

誰かがこのクラスを使用する可能性のあるシナリオを投稿してください。

答えて

22

これは一般にパーサーコンビネータで使用されます。たとえば、spaceが単一の空白文字に一致するパーサーコンビネータである場合、many spaceは連続する空白に一致するものになります。

でも、それはControl.Applicativeで少し外れていることに同意できます。

+18

のみ*若干*場違い - それは両方とも、 'MonadPlus'と' ArrowPlus'と同じパターンで、Applicative's '上のモノイドですそれらのモジュールは、それらが基づいているクラスとモジュールを共有します。一貫性のために、 "ApplicativePlus"と呼ばれていたはずですが、それは醜い名前です。 –

+0

これは大いに説明します。 'ApplicativePlus'を' Alternative'に命名するのは、後者がその範囲を限定する意味を持っているので、あまり良いことではありません。 –

+0

@C。 A. McCann、私はそれを受け入れることができるようにあなたのコメントを答えに変換したいと思います:) –

16

時々<|>オペレータは非常に便利です:

foldl1 (<|>) [Nothing, Just 5, Just 3] 
-- Just 5 
+1

ああ、面白いです!その文脈では、<|>は短絡のようです。演算子は多くの命令型言語で記述することができます。 –

+3

これは 'mconcat'を使って[最初のモノイド](http://haskell.org/ghc/docs/latest/html/libraries/base/Data-Monoid)で行うことができます。 html#t:最初)。これは[他の 'Maybe'モノイド](http://byorgey.wordpress.com/2011/04/18/monoids-for-maybe/)にうまく一般化されます。 – hammar

+5

ああ、いいえ、分かりやすいデフォルト( 'foldl(<|>)Nothing')があるところで、' foldl1'がどこかで使われました。あなたの答えがクラッシュしたとき、あなたは何をしますか? :D – Rotsor