参考URL
#ソース
https://github.com/0zawa/scheme_in_48_hours/blob/master/parsing.hs
spaceの除去
入力文字列に含まれた余計なスペースを除去するための関数を作ります。
spaces :: Parser ()
spaces = skipMany1 space
型をみるとParser ()になっているので、
この関数はパース結果は返しません。
space関数は入力文字列の先頭がスペースなら
それをパースする関数です。
> parse space "space_test" " 1"
Right ' '
> parse space "space_test" "1"
Left "space_test" (line 1, column 1):
unexpected "1"
expecting space
skipMany1は引数に渡すパーサ関数がパースに成功する限り
パースを継続し、パース結果は破棄する関数です。
なので
skipMany1 space
と組み合わせると
入力文字列の先頭にある1個以上のスペースを
全て取り除くパース関数になります。
更にこれとsymbolを組み合わせてparse関数に渡すと、
> parse (spaces >> symbol) "test" " #"
Right '#'
入力文字列の最初の連続した空白を全て取り除き、
その次の文字をsymbolで指定した文字列でパースすることになります。
ただしspacesは1文字以上のスペースを取り除くパース関数なので、
空白が含まれない場合はエラーになります。
> parse (spaces >> symbol) "test" "#"
Left "test" (line 1, column 1):
unexpected "#"
expecting space