組合子
解析輸入最好通過較大的解析器函式來實現,這些函式由較小的單一目的函式組成。
假設我們希望解析代表工作時間的以下文字:
星期一: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"