Parsec(3)
今から友人宅に行くので、その前に即興で書き上げたパーサー
2011/07/31
→07.31,2011
とするようなものです。
import Text.Parsec import Text.Parsec.String num :: Parser String num = many1 digit date :: Parser String date = date' >>= return.(\(y:m:d:_)->m++"."++d++","++y) date' :: Parser [String] date' = do y <- num b <-many (char '/' >> num >>= return) return (y:b) main = parseTest date "2011/07/31"
date'をdateに結びつけて一つの関数として実現したいですね。
昨日同様、Applicativeで書き直す
mport Control.Applicative hiding (many) import Text.Parsec import Text.Parsec.String num :: Parser String num = many1 digit date :: Parser String date = (\(y:m:d:_)->m++"."++d++","++y) <$> date' date' :: Parser [String] date' = (:) <$> num <*> many(char '/' >> num) main = parseTest date "2011/07/31"
うん。こんな感じになるのかな?
更に、上で述べたように、date,date'を一つの関数として結びつけてみた
import Control.Applicative hiding (many) import Text.Parsec import Text.Parsec.String num :: Parser String num = many1 digit date :: Parser String date =(\(y:m:d:_)->m++"."++d++","++y)<$> ((:) <$> num <*> many(char '/' >> num)) main = parseTest date "2011/07/31"
スペースを入れても動くか実験したけど、
どうもうまくいかない
いや、原因はわかるんですけど。
try spaceを入れる位置がだめなんです。
'/'を呼ぶ前及びnumを呼ぶ前にそれぞれ入れてやったらいいんでしょう。
なんParsec簡単に思えてきた。
前は苦しめられたけど、最近すごい楽しい