Haskell语言学习笔记(46)Parsec
Posted zwvista
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Haskell语言学习笔记(46)Parsec相关的知识,希望对你有一定的参考价值。
Applicative Parsing
使用 Applicative 式的 Parser。
包括使用 (<$>), (<*>), (<$), (<*), (*>), (<|>), many 等运算符。
import Control.Monad
-- show
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
-- /show
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 = (:) <$> char ‘-‘ <*> number
(:) <$> p1 <*> p2 依次匹配 p1 和 p2,然后联结两次匹配的结果。
这里 p1 匹配的结果是字符,p2 匹配的结果是字符串,所以用 (:) 来联结。 - float = fmap rd $ (++) <$> integer <*> decimal
(++) <$> p1 <*> p2 依次匹配 p1 和 p2,然后联结两次匹配的结果。
这里两次匹配的结果都是字符串,所以用 (++) 来联结。 - decimal = option "" $ (:) <$> char ‘.‘ <*> number
option "" p 尝试匹配 p 如果不成功则返回空字符串 ""。
参考链接
以上是关于Haskell语言学习笔记(46)Parsec的主要内容,如果未能解决你的问题,请参考以下文章
An introduction to parsing text in Haskell with Parsec