我目前正在撰寫一個基本的決議器。type 的決議器a在引數中接受一個字串,然后不回傳任何內容,或者回傳一個型別的物件a和字串的其余部分。
這是一個滿足所有這些特性的簡單型別:
type Parser a = String -> Maybe (a, String)
例如,我撰寫了一個將 aChar作為引數并回傳 a的函式Parser Char:
parseChar :: Char -> Parser Char
parseChar _ [] = Nothing
parseChar c (x:xs)
| c == x = Just (x, xs)
| otherwise = Nothing
我想撰寫一個函式,它在引數中使用決議器并嘗試將其應用零次或多次,回傳已決議元素的串列:
parse :: Parser a -> Parser [a]
用法示例:
> parse (parseChar ' ') " foobar"
Just (" ", "foobar")
我試圖撰寫一個遞回函式,但我無法將決議的元素保存在串列中。
如何多次應用決議并將結果保存在串列中?
uj5u.com熱心網友回復:
我試圖撰寫一個遞回函式,但我無法將決議的元素保存在串列中。
你不需要“保存”任何東西。您可以使用模式匹配。這是一個提示。嘗試推理在下面的每種情況下應該發生什么。中間的情況有點微妙,如果您一開始弄錯了,請不要擔心。請注意下面如何使用s和s'。
parse :: Parser a -> Parser [a]
parse p s = case p s of
Nothing -> ... -- first p failed
Just (x,s') -> case parse p s' of
Nothing -> ... -- subtle case, might not be relevant after all
Just (xs,s'') -> ... -- merge the results
另一個提示:請注意,根據您的描述parse p應該永遠不會失敗,因為它始終可以回傳空串列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/314441.html
下一篇:從UNION查詢中洗掉空行
