在我的教科书中,有一个如何使用解析器从字符串中取出第一个和第三个字符的示例。我试图把它写下来,因为它在书中。
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")])
我得错了输出。
所以我有两个问题:
答案 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
。