wvogel日記

自分用の技術備忘録が多めです.

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簡単に思えてきた。
前は苦しめられたけど、最近すごい楽しい