Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.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
Haskell 在输入“”上的“do”块中分析错误<-`_Haskell_Monads_Parse Error - Fatal编程技术网

Haskell 在输入“”上的“do”块中分析错误<-`

Haskell 在输入“”上的“do”块中分析错误<-`,haskell,monads,parse-error,Haskell,Monads,Parse Error,在我的教科书中,有一个例子说明了如何使用解析器从字符串中取出第一个和第三个字符。我试着把它写在书上 type Parser a = String -> [(a,String)] item = \inp -> case inp of []-> [] (x:xs) -> [(x,xs)] p = do x <- item item y <- item return (x,y) 但如下图所示: *Main&g

在我的教科书中,有一个例子说明了如何使用解析器从字符串中取出第一个和第三个字符。我试着把它写在书上

type Parser a = String -> [(a,String)]

item = \inp -> case inp of
    []-> []
    (x:xs) -> [(x,xs)]

p = do 
    x <- item
    item 
    y <- item
    return (x,y)
但如下图所示:

*Main> q "abc"
([('a',"bc")],[('a',"bc")],[('a',"bc")])
我得到了错误的输出

所以我有两个问题:

  • 我应该怎样写p
  • 我应该如何写q
    这只是格式化的事情。开始换行:

    p = do
        x <- item
        item
        y <- item
        return (x,y)
    

    …这相当于
    p

    p现在正在编译,但它仍然给出了错误的结果。p“abcd”给出结果([('a',“bcd”)],[('a',“bcd”)],[('a',“bcd”)])。我想得到结果[('a','c'),“d”],这是我书中的结果。@mcNogard您可能无意中编写了内联
    项。也就是说,它应该是
    do{x啊,但是等等:您使用的是函数monad,而不是解析器monad!您需要将
    Parser
    定义为另一种类型,并生成一个monad实例。当然,如果您没有使用正确的monad,它将不起作用!我有一种预感,
    item
    的定义是错误的(它不应该只是一个函数,这使得它对于解析器来说是完全错误的monad),而且如果它像这样编译,那么
    解析器
    的定义也是错误的(也许它是用
    类型
    定义的?你不能为用
    类型
    定义的东西定义自己的monad)我将发布我是如何编写解析器的。对,这就是我所想的。你将无法让do符号正确地为具有该类型定义的解析器工作。在这种情况下,我的书的定义是错误的。你能发布真实的定义吗?@mcNogard问题在于实例。将其设为Monad。
    *Main> q "abc"
    ([('a',"bc")],[('a',"bc")],[('a',"bc")])
    
    p = do
        x <- item
        item
        y <- item
        return (x,y)
    
    q = do
        x1 <- item 
        item
        x3 <- item
        return (x1, x3)