wikibooks/haskellの演習に取り組んでいます。MonadPlusの章に、この hexChar 関数を記述してほしいという演習があります。私の関数は以下のように動作しますが、2 つのヘルパー パーサー (digitParse と alphaParse) を切り替えようとすると、関数が正しく動作しなくなります。それらを切り替えると、数字のみを解析でき、アルファベット文字は解析できなくなります。
これはなぜですか?
char :: Char -> String -> Maybe (Char, String)
char c s = do
let (c':s') = s
if c == c' then Just (c, s') else Nothing
digit :: Int -> String -> Maybe Int
digit i s | i > 9 || i < 0 = Nothing
| otherwise = do
let (c:_) = s
if read [c] == i then Just i else Nothing
hexChar :: String -> Maybe (Char, String)
hexChar s = alphaParse s `mplus` digitParse s -- cannot switch these to parsers around!!
where alphaParse s = msum $ map ($ s) (map char (['a'..'f'] ++ ['A'..'F']))
digitParse s = do let (c':s') = s
x <- msum $ map ($ s) (map digit [0..9])
return (intToDigit x, s')