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 = 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)