Haskell语言学习笔记(46)Parsec(3)
2017-12-01 19:50
483 查看
Applicative Parsing
使用 Applicative 式的 Parser。包括使用 (<>),(<\*>),(<), (<*), (*>), (<|>), many 等运算符。
应用实例1
import Control.Monad import Text.Parsec import Control.Applicative hiding ((<|>)) number = many1 digit plus = char '+' *> number minus = (:) <$> char '-' <*> number integer = plus <|> minus <|> number float = fmap rd $ (++) <$> integer <*> decimal where rd = read :: String -> Float decimal = option "" $ (:) <$> char '.' <*> number main = forever $ do putStrLn "Enter a float: " input <- getLine parseTest float input
*Main> main Enter a float: 2.3 2.3 Enter a float: 1 1.0 Enter a float: -1 -1.0 Enter a float: +6.98 6.98
plus = char ‘+’ *> number
p1 *> p2 依次匹配 p1 和 p2,但是 p1 被舍弃,只返回 p2。
minus = (:)
应用实例2
import Text.Parsec import Control.Applicative ((<$), (<*), (*>), liftA) import Data.Char (chr) parseCSV :: String -> Either ParseError [[String]] parseCSV = parse csvp "" csvp :: Parsec String () [[String]] csvp = line `endBy` newline <* eof line :: Parsec String () [String] line = cell `sepBy1` char ',' cell :: Parsec String () String cell = cell' <|> many (noneOf ",\n") where cell' = between (char '"') (char '"') $ many chr chr = noneOf "\"" <|> try ('"' <$ string "\"\"")
*Main> parseCSV "a,b,c\n" Right [["a","b","c"]] *Main> parseCSV "a,b,\"c\"\n" Right [["a","b","c"]] *Main> parseCSV "a,b,\"c\"\"d\"\n" Right [["a","b","c\"d"]]
csvp = line `endBy` newline <* eof
p1 <* p2 依次匹配 p1 和 p2,但是 p2 被舍弃,只返回 p1。
endBy p sep 匹配0次或多次 p + sep 所组成的序列,返回 p 的 list。
line = cell `sepBy1` char ‘,’
sepBy1 p sep 匹配 p 后接0次或多次 sep + p 组成的序列,返回 p 的 list。
chr = noneOf “\”” <|> try (‘”’
参考链接
Parsing Floats With ParsecA Gentle Introduction to Parsec
相关文章推荐
- Haskell语言学习笔记(41)Parsec(1)
- Haskell语言学习笔记(43)Parsec(2)
- Haskell语言学习笔记(38)Lens(1)
- Haskell语言学习笔记(26)Identity, IdentityT
- Haskell语言学习笔记(12)Data.Function
- Haskell语言学习笔记(32)Data.Maybe, Data.Either
- Haskell语言学习笔记(2)
- Haskell语言学习笔记(10)Writer Monad
- Haskell语言学习笔记(39)Category
- Haskell语言学习笔记(27)Endo, Dual, Foldable
- Haskell语言学习笔记(33)Exception, Except, ExceptT
- Haskell语言学习笔记(40)Arrow(1)
- Haskell语言学习笔记(16)Alternative
- Haskell语言学习笔记(13)Monadic Functions
- Haskell语言学习笔记(30)MonadCont, Cont, ContT
- Haskell语言学习笔记(34)System.Environment
- Haskell语言学习笔记(20)IORef, STRef
- Haskell语言学习笔记(42)Bifunctor
- Haskell语言学习笔记(19)File IO
- Haskell语言学习笔记(45)Profunctor