2017-09-21 17 views
0

ReadPパッケージの対称選択(+++)演算子に問題があります。Text.ParserCombinators.ReadP(Haskell)で(+++)演算子の動作

https://www.haskell.org/cabal/release/cabal-1.22.8.0/doc/API/Cabal/Distribution-Compat-ReadP.html

私はちょうどいくつかのことをしようとしてきたインターネット上のREADP libに多くの例を見つけることができないので。

私は偏った選択が期待通りに機能することに気付きました。左側をパースすることを好んで、失敗した場合は正しいパーザを選択します。

fmap Just (munch1 dianaFloat) <++ return Nothing

私は、対称な選択演算子を挿入した場合。アルゴリズムは終了しません。

fpail) <++ return Nothing

==

fpail) +++ return Nothing

は、だから私の質問は、どのような使用はされています。私は左側を聞かせている場合

fmap Just (munch1 dianaFloat) +++ return Nothing

、どちらも同じ結果をもたらす失敗(+++)演算子は、両方が解析に成功したときに終了しないように見えます。

+1

ところで、ソースはベースで見つけることができます。 https://hackage.haskell.org/package/base-4.10.0.0/docs/Text-ParserCombinators-ReadP.html –

+2

無終了を再現することはできません。 ''( '' Nothing、 "c")、(単に "c"、 "") ''を生成します。 –

+0

うーん..あなたの小さな例では、それは選択しませんが、両方の結果を返すだけです。大きなファイルでは、私は解析していますが、何も起こりません。 – ritchie46

答えて

5

オペレータ の可能性がある場合は、両方の結果を返すためにオペレータがバックトラックできます。ここでは簡単な例です:

> readP_to_S (many (string "aa" +++ string "a") <* eof) "aaa" 
[(["aa","a"],""),(["a","aa"],""),(["a","a","a"],"")] 

あなたがここに<++を使用した場合のみ、最初の結果を得るでしょう。

あなたの例では、2つの の可能性(残さ入力の異なる量で)できるように、いくつかの状況で細かい仕事ができる

> readP_to_S (fmap Just (munch1 (=='a')) +++ return Nothing) "aaa" 
[(Nothing,"aaa"),(Just "aaa","")] 

私の推測では、あなたはそれが可能だいくつかのコンテキストでそれを使用していることである manyや再帰のように、繰り返してreturn Nothingを選択してください。これはどんな文字も消費しないので、 は、 "return Nothing"を永遠に繰り返して選択し、 入力を何も取得しないという解析を生成しようとしている可能性があります。

あるいはそれは それ回など使用する場合、それは、一度別のreturn Nothingを使用 一例のために、構文解析の無限の数を生成することができます。この場合は通常、無限のパーズリストの印刷を開始するには、 が幸いですが、おそらく が分かります。