可能性の重複:
Haskell: some and many
Haskell - What is Control.Applicative.Alternative good for?機能
Alternative
型クラス内の関数some
とmany
はのために有用何ですか? Docsは私が理解できなかった再帰的な定義を提供します。
可能性の重複:
Haskell: some and many
Haskell - What is Control.Applicative.Alternative good for?機能
Alternative
型クラス内の関数some
とmany
はのために有用何ですか? Docsは私が理解できなかった再帰的な定義を提供します。
some
とmany
は、次のように定義することができます"回、結果をconsesします。 many f
はf
"some"回実行されます。または、「代替」は空のリストを返します。考え方は、彼らが両方とも "失敗"するまで、できるだけ頻繁にf
を実行し、結果をリストに集めることです。違いはsome f
はf
がすぐに失敗すると失敗し、many f
は成功し、空のリストを「返す」ということです。しかし、これはすべて正確にどのように<|>
が定義されているかによって決まります。
解析するだけに便利ですか?ベースにあるインスタンスの動作を見てみましょう:Maybe
、[]
、STM
最初Maybe
。 Nothing
は失敗を意味するので、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 f
とmany f
は、再試行するまで、f
を繰り返し実行します。私はこれが有用なものかどうかは分かりませんが、私はそれがないと推測しています。
ので、Maybe
、[]
とSTM
many
とsome
のためにその有用であるとは思えません。これは、申請者が同じことを何度も繰り返し実行しているときに、障害を起こす可能性がある種の状態がある場合にのみ有用です。パーサーの場合、これは成功したすべての一致で縮小している入力です。
など。 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 []
:
私はParsecに慣れていません。私はいくつかの説明を感謝します。 – missingfaktor
私が理解する限り、あなたはXのパーサ 'p'を持っているなら、' some p'は0個以上のXのパーサーであり、 'many p'は1個以上のXのパーサーです。 – Ingo
@missingfaktor' some 'と' many 'は '<|>'の形で実装されています。このコンビネータは他の方法でも便利です。単に「0-ただ1 =ちょうど0」、「何もありません」<|>「ちょうど2 =ちょうど2」、「ちょうど3:<|>はありません=ちょうど3」、「何もありません」<|> Nothing = Nothing' – fuz
@Landei:そのスレッドで回答を読みましたが、まだそれを取得しません。 – missingfaktor
私はちょうどこの質問が重複していると言っていましたが、元のものは良い答えがあったわけではありません:-)それは私にとっては十分でしたが、これらの機能は私には面白くない可能性が高いとわかりました... – Landei
@Landei:あなたと同じ結論に達しています。 :-) – missingfaktor