Re:ParsecでApplicativeを使ってみる

ParsecでApplicativeを使ってみる

追記されたコードもう Functor しか使ってない…!ということで、こういうのはどうでしょう。

parseSExp :: Parser Int
parseSExp = between (char '(') (char ')') expr
            where
                expr = foldl1 <$> op <* spaces <*> nums
                op = aux <$> opch
                opch = oneOf ['+', '-', '*']
                aux '+' = (+)
                aux '-' = (-)
                aux '*' = (*)
                nums = sepBy1 num spaces
                num = read <$> many1 digit

"<* spaces" がかなりゴミっぽいので Haskell のプロの人なんとかしてください〜><

Applicative は使わずに do を使うと…?

parseSExP :: Parser Int
parseSExP = do
                between (char '(') (char ')') expr
            where
                expr = do
                           opch <- oneOf ['+', '-', '*']
                           spaces
                           nums <- sepBy1 num spaces
                           return $ foldl1 (aux opch) nums
                num = fmap read $ many1 digit
                aux '+' = (+)
                aux '-' = (-)
                aux '*' = (*)

大差なかった