Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 自制的;许多“1”;分析器_Parsing_Haskell - Fatal编程技术网

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