機能

2011-10-06 6 views
15

可能性の重複:
Haskell: some and many
Haskell - What is Control.Applicative.Alternative good for?機能

Alternative型クラス内の関数somemanyはのために有用何ですか? Docsは私が理解できなかった再帰的な定義を提供します。

+0

@Landei:そのスレッドで回答を読みましたが、まだそれを取得しません。 – missingfaktor

+0

私はちょうどこの質問が重複していると言っていましたが、元のものは良い答えがあったわけではありません:-)それは私にとっては十分でしたが、これらの機能は私には面白くない可能性が高いとわかりました... – Landei

+0

@Landei:あなたと同じ結論に達しています。 :-) – missingfaktor

答えて

33

somemanyは、次のように定義することができます"回、結果をconsesします。 many ff "some"回実行されます。または、「代替」は空のリストを返します。考え方は、彼らが両方とも "失敗"するまで、できるだけ頻繁にfを実行し、結果をリストに集めることです。違いはsome ffがすぐに失敗すると失敗し、many fは成功し、空のリストを「返す」ということです。しかし、これはすべて正確にどのように<|>が定義されているかによって決まります。

解析するだけに便利ですか?ベースにあるインスタンスの動作を見てみましょう:Maybe[]STM

最初MaybeNothingは失敗を意味するので、some Nothingも失敗し、Nothingと評価され、many Nothingが成功し、Just []と評価されます。 Just()は決して失敗しないので、some (Just())many (Just())は返されません!ある意味では、彼らはJust (repeat())と評価します。リストでは

[]は失敗を意味し、そうmany [][[]]に評価しながら、some [][](無回答)と評価された(そこに答えは一つだし、空のリストです)。再度some [()]many [()]は返されません。インスタンスを展開すると、some [()]fmap (():) (many [()])となり、many [()]some [()] ++ [[]]を意味するので、many [()]tails (repeat())と同じです。

STMの場合、失敗は、トランザクションを再試行する必要があることを意味します。そのため、many retryは単に空のリストを返しますが、some retryはそれ自体を再試行します。 some fmany fは、再試行するまで、fを繰り返し実行します。私はこれが有用なものかどうかは分かりませんが、私はそれがないと推測しています。

ので、Maybe[]STMmanysomeのためにその有用であるとは思えません。これは、申請者が同じことを何度も繰り返し実行しているときに、障害を起こす可能性がある種の状態がある場合にのみ有用です。パーサーの場合、これは成功したすべての一致で縮小している入力です。

8

など。 parsing(「適用例による解析」セクションを参照)。

some f = do 
    x <- f 
    xs <- many f 
    return (x:xs) 

のでsome f実行一度f、その後、「多く:おそらくそれはsomeはモナドdo構文で記述されたことになるかを確認するのに役立ちます

some f = (:) <$> f <*> many f 
many f = some f <|> pure [] 

+2

私はParsecに慣れていません。私はいくつかの説明を感謝します。 – missingfaktor

+2

私が理解する限り、あなたはXのパーサ 'p'を持っているなら、' some p'は0個以上のXのパーサーであり、 'many p'は1個以上のXのパーサーです。 – Ingo

+2

@missingfaktor' some 'と' many 'は '<|>'の形で実装されています。このコンビネータは他の方法でも便利です。単に「0-ただ1 =ちょうど0」、「何もありません」<|>「ちょうど2 =ちょうど2」、「ちょうど3:<|>はありません=ちょうど3」、「何もありません」<|> Nothing = Nothing' – fuz

関連する問題