ここでの 4 番目の演習の一部として、 parsecreads
など
の型関数を使用したいと思います。readHex
Parser
これを行うために、私は関数を書きました:
liftReadsToParse :: Parser String -> (String -> [(a, String)]) -> Parser a
liftReadsToParse p f = p >>= \s -> if null (f s) then fail "No parse" else (return . fst . head ) (f s)
たとえばGHCIでは、次のように使用できます。
*Main Numeric> parse (liftReadsToParse (many1 hexDigit) readHex) "" "a1"
Right 161
次の点に関して、このアプローチの改善を誰でも提案できますか?
(f s)
れた場合に 2 回評価されますか?
null (f s)
False
length (f s)
が 1 より大きい場合、parsec がこれをどのように処理するかわかりません。
(snd . head) (f s)
.