Parsing 自制的;许多“1”;分析器
这是在线课程的任务。我已经在这上面坐了两天了。请给出一些解释或提示来解决它 这是你的类型Parsing 自制的;许多“1”;分析器,parsing,haskell,Parsing,Haskell,这是在线课程的任务。我已经在这上面坐了两天了。请给出一些解释或提示来解决它 这是你的类型 newtype Prs a = Prs { runPrs :: String -> Maybe (a, String) } 我需要实现many1解析器。这就是它应该如何工作 > runPrs (many1 $ char 'A') "AAABCDE" Just ("AAA","BCDE") > runPrs (many1 $ char 'A') "BCDE" Nothing 我有很多解析
newtype Prs a = Prs { runPrs :: String -> Maybe (a, String) }
我需要实现many1
解析器。这就是它应该如何工作
> runPrs (many1 $ char 'A') "AAABCDE"
Just ("AAA","BCDE")
> runPrs (many1 $ char 'A') "BCDE"
Nothing
我有很多解析器都是这样实现的
many p = (:) <$> p <*> many p <|> pure []
注意最后一个结果,它返回空字符串,但many1
应该返回Nothing
。我不知道如何更改许多
代码,使其像许多
一样工作。我无法理解如何在第一个错误的符号上停止 您的many1
需要某种方法才能失败:在您编写它时,它会消耗字符一段时间,将它们视为挂起的结果,直到最终耗尽匹配项。这不包括解析可能失败的任何情况
在某种程度上,您在这里实现的是,many0
,一个消耗0次或更多次重复的解析器。你能想出一种方法来实现many1
中的many0
?它将看起来像:
使用一个p
实例,如果失败,则无需其他选择
使用0个或多个p
实例,失败时返回[]
或者在哈斯克尔
many1 :: Prs a -> Prs [a]
many1 p = (:) <$> p <*> many0 p
many1::Prs a->Prs[a]
many1p=(:)p many0p
谢谢,它适用于示例案例,现在我有了这个想法。但不幸的是,在其他一些测试中,它在评分系统上失败了。
many1 :: Prs a -> Prs [a]
many1 p = (:) <$> p <*> many0 p