Windows + stack
%USERPROFILE%/AppData/Local/Programs/stack/x86_64-windows/ghc-8.4.4/lib/settings
%USERPROFILE%/AppData/Local/Programs/stack/x86_64-windows/ghc-8.4.4/lib/settings
~/AppData/Local/Programs/stack/x86_64-windows/ghc-8.4.4/mingw/bin15:28$ > ./ld.exe -V GNU ld (GNU Binutils) 2.29.1 Supported emulations: i386pep i386pe
~/AppData/Local/Programs/stack/x86_64-windows/ghc-8.4.4/mingw/bin15:29$ > ./ld.gold.exe -V GNU gold (GNU Binutils 2.29.1) 1.14 Supported targets: elf32-iamcu elf32-i386 elf32-i386-freebsd ... 以下略 ...
(p <|> q)
でも、p
が失敗したときに入力を消費していないことが、q
を実行する条件。p
が失敗したときに入力を消費しているときには、 (p <|> q)
が失敗する。try
で捕まえなければ、結果的に全体が失敗する。try
を入れることで無駄なバックトラックを減らして効率化する方式なんですね。p *> q <|> p *> r === p *> (q <|> r)
For reasons of speed, the (<|>) combinator is predictive; it will only try its second alternative if the first parser hasn't consumed any input. Consider the following example parser:
index.html.ja、index.html の優先順位でファイルを返答するときに
v >> mzero = mzero