码迷,mamicode.com
首页 > 编程语言 > 详细

Haskell语言学习笔记(46)Parsec(3)

时间:2017-11-21 01:08:05      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:oat   logs   char   string   包括   option   联结   参考   markdown   

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 如果不成功则返回空字符串 ""。

参考链接

Parsing Floats With Parsec

Haskell语言学习笔记(46)Parsec(3)

标签:oat   logs   char   string   包括   option   联结   参考   markdown   

原文地址:http://www.cnblogs.com/zwvista/p/7868767.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!