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

时间:2015-10-04 12:18:22

标签: 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)

但是我收到了消息:

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?

1 个答案:

答案 0 :(得分:2)

这只是一种格式化的东西。开始换行:

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