組合子

解析輸入最好通過較大的解析器函式來實現,這些函式由較小的單一目的函式組成。

假設我們希望解析代表工作時間的以下文字:

星期一: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"