输入 `<-` 上的 `do` 块中的解析错误

Parse error in a `do` block on input `<-`

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

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)

但是我收到消息:

dataTest.hs:47:11:
parse error on input ‘<-’
Perhaps this statement should be within a 'do' block?

由于我无法弄清楚出了什么问题,所以我写下了代码的一个不太抽象的版本:

q = item >>= \x1 -> 
    item >>= \x2 ->
    item >>= \x3 -> 
    return (x1, x3)

但是如下图:

*Main> q "abc"
([('a',"bc")],[('a',"bc")],[('a',"bc")])

我得到了错误的输出。

所以我有两个问题:

  1. p应该怎么写?
  2. q应该怎么写?

这只是一个格式化问题。开始换行:

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

至于q,记得do {x <- item; f x}等同于item >>= \x -> f x,第二个是多余的,所以:

q = do
    x1 <- item 
    item
    x3 <- item
    return (x1, x3)

...等同于p.