Haskell 使用parsec按分号分析字符串

Haskell 使用parsec按分号分析字符串,haskell,parsec,Haskell,Parsec,这是我的任务之一。解析器getList假设以下一种方式工作 GHCi> parseTest getList "1;234;56" ["1","234","56"] GHCi> parseTest getList "1;234;56;" parse error at (line 1, column 10): unexpected end of input expecting digit GHCi> parseTest getList "1;;234;56" parse error

这是我的任务之一。解析器getList假设以下一种方式工作

GHCi> parseTest getList "1;234;56"
["1","234","56"]
GHCi> parseTest getList "1;234;56;"
parse error at (line 1, column 10):
unexpected end of input
expecting digit
GHCi> parseTest getList "1;;234;56"
parse error at (line 1, column 3):
unexpected ";"
expecting digit
我的解决方案
getList=多位数'sepBy1'char';'是这样工作的

*Main> test1
["1","234","56"]
*Main> test2
["1","234","56",""]
*Main> test3
["1","","234","56"]
这是不对的,我不知道如何处理双重引用的案例

试试这个:

getList = do
    many1 digit
    many $ do
       char ';'
       many1 digit

使用
megaparsec
(我推荐使用
parsec
):

这意味着“至少一个数字,至少一次,用分号分隔”。请注意,我使用的是
some
,而您的尝试使用了
many

ghci> parse getList "" "123;456"
Right ["123", "456"]
ghci> parse getList "" "123;;456"
Left (ParseError {errorPos = SourcePos {sourceName = "", sourceLine = Pos 1, sourceColumn = Pos 5} :| [], errorUnexpected = fromList [Tokens (';' :| "")], errorExpected = fromList [Label ('d' :| "igit")], errorCustom = fromList []})

您的问题是什么
多个数字
是接受零个或多个数字的解析器。例如,您应该使用
多个1位数
。因此,总而言之:

getList = many1 digit `sepBy` char ';'

只需
筛选出空字符串?它应该只是解析器解决方案,应该和第一个框中的一样工作。
多个数字'sebby'(many1$char';')
然后呢?不,它在第二和第三种情况下没有给出错误。我不明白。您需要解析double
或者您需要在它们上出错?最后的测试是正确的,但第一个是错误的
[“234”,“56”]
嗯,您也需要考虑一下。第一个数字被解析了,你只需要找出如何把它从这个do-block中拉出来。如果我有足够的知识,我会完全按照你说的去做,而且我在这里也不会问任何问题。无论如何,谢谢。谢谢你的解决方案,但这是出于教育目的,所以我必须使用parsecI。我相信你能够弄清楚如何将它翻译成Parsec。唯一真正的区别是Parsec将
digitChar
拼写为
digit
。谢谢,你是救世主:)
getList = many1 digit `sepBy` char ';'