组合子
解析输入最好通过较大的解析器函数来实现,这些函数由较小的单一目的函数组成。
假设我们希望解析代表工作时间的以下文本:
星期一:0800 1600。
我们可以把这些分成两个代币:日名 - 星期一 - 和时间部分 0800
到 1600
。
要解析日期名称,我们可以编写以下内容:
data Day = Day String
day::Parser Day
day = do
name <- takeWhile1 (/= ':')
skipMany1 (char ':')
skipSpace
return $ Day name
要解析我们可以编写的时间部分:
data TimePortion = TimePortion String String
time = do
start <- takeWhile1 isDigit
skipSpace
end <- takeWhile1 isDigit
return $ TimePortion start end
现在我们有两个解析器用于文本的各个部分,我们可以将它们组合在一个更大的解析器中,以读取整天的工作时间:
data WorkPeriod = WorkPeriod Day TimePortion
work = do
d <- day
t <- time
return $ WorkPeriod d t
然后运行解析器:
parseOnly work "Monday: 0800 1600"