私はパーサーコンビネータについてのチュートリアルを読んでいて、理解しようとすると少し助けてくれる関数を見つけました。Haskell Parser Combinators - 文字列関数
let while_parser = string "while"
、その後、私は文字列は、たとえば言う解析するためにそれを使用:
satisfy :: (Char -> Bool) -> Parser Char
satisfy p = item `bind` \c ->
if p c
then unit c
else (Parser (\cs -> []))
char :: Char -> Parser Char
char c = satisfy (c ==)
natural :: Parser Integer
natural = read <$> some (satisfy isDigit)
string :: String -> Parser String
string [] = return []
string (c:cs) = do { char c; string cs; return (c:cs)}
私の質問は、文字列関数の仕事をしたり、むしろそれが終了しないか、私のような何かをしたと言う方法です parse while_parser "while if"
、それは正しく私に "while"を解析します。
しかし、parse while_parser "test
のようなものを試してみると、[]が返されます。
私の質問はどのように失敗するのですか? char cが空のリストを返すとどうなりますか?
私は 'char c'が"空のリストを返す "とは思っていませんが、入力の最後に*失敗*します。バインド演算子は、その失敗を伝播します。 – MathematicalOrchid
あなたは 'let while_parser = string 'を意味していましたが、' '、そうですか? – sepp2k
@MathematicalOrchid charが失敗したときにsatisfの定義から、空のリストを生成する関数を返します。伝播の失敗はどういう意味ですか? – Zubair