如果我有一個決議器而不是將一串由空格分隔的數字讀取到一個 Int 串列中,我該如何處理尾隨空格?目前我有:
row :: Parser [Int]
row = do
optional spaces
f <- (many (oneOf "0123456789"))
r <- ((char ' ') >> row) <|> pure []
pure (read f:r)
對于沒有尾隨空格但因尾隨空格而失敗的字串,它可以正常作業。
>λ= parse row "" " 2 0 12 3 7"
Right [2,0,12,3,7]
>λ= parse row "" " 2 0 12 3 7 "
Right [2,0,12,3,7,*** Exception: Prelude.read: no parse
這個問題的解決方案是什么,更重要的是,我怎么會有一個條件,如果'\n'被消耗然后決議器回傳[]
編輯:通過閱讀@amalloy 的答案和決議源代碼,我認為添加一個在這里作業的版本很有用(盡管@amalloy 的建議不要嘗試滾動現有功能更有意義)
row :: Parser [Int]
row = do
spaces
f <- (read <$> many1 digit)
do
many1 $ char ' '
r <- row
pure (f:r) <|> pure [x]
<|> pure []
uj5u.com熱心網友回復:
與其自己實作所有這些低級的東西,我建議只使用sepEndBy. 例如,
row :: Parser [Int]
row = spaces *> (int `sepEndBy` many1 space)
where int = read <$> many1 digit
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/387030.html
