组合子

解析输入最好通过较大的解析器函数来实现,这些函数由较小的单一目的函数组成。

假设我们希望解析代表工作时间的以下文本:

星期一:0800 1600。

我们可以把这些分成两个代币:日名 - 星期一 - 和时间部分 08001600

要解析日期名称,我们可以编写以下内容:

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"