2013-02-28 45 views
0

这里是我认为不应该引起任何问题的代码,但由于某种原因呢?Haskell Parsec出现多个表达式的奇怪问题

program = expr8 
     <|> seqOfStmt 

    seqOfStmt = 
     do list <- (sepBy1 expr8 whiteSpace) 
      return $ if length list == 1 then head list else Seq list 

我得到3个错误全部在'列表'不在范围内? 这可能是公然明显什么是错的,但我不明白为什么

如果有任何替代品,我会非常喜欢听到他们!

在此先感谢,肖恩

+2

你的缩进看起来很糟糕('program'和'seqOfStmt'后面的行应该比定义更加缩进,除此之外,在不知道你的其他定义是什么的情况下测试你的程序是非常困难的(例如'expr8' ,'whiteSpace'和'Seq'从哪里来?) – 2013-02-28 10:04:18

+0

问题是你正在返回的值的类型:'如果长度列表== 1然后是头列表否则Seq列表' - 比方说列表是[a],那么你在then子句中返回一个和else子句中非常不同的东西(除非Seq是类型为[a] - > a'的构造函数,这是不容易的)。 – Ingo 2013-02-28 10:18:02

回答

3

你最后的行使用缩进一个制表符,而其他线路只使用空格。

你的标签在你的编辑器中设置为四个空格,但ghc使用八个字符的制表位(就像终端一样)。

因此,您的return行被解析为前一行的延续,并且list尚不在范围内。

解决此问题的一个简单方法是避免使用制表符:仅限使用空格。


一旦你已经修复了,你的下一个错误可能会是一个错误类型:head listSeq list有不同类型的(除非也许你已经重新定义head出于某种原因)。目前还不清楚,为什么你想要以不同的方式处理这个列表,如果它只包含一个元素。

+0

工作,但我现在有一个错误返回,任何想法?很明显,我不能胜任Haskell – Sean 2013-02-28 10:09:46

+1

我不是精神病患者!如果你现在就发布你的代码,并且完全错误 信息。理想地发布一个新问题。 – dave4420 2013-02-28 10:12:48

+2

加入@ dave4420,你可以依靠SO提供的超过10K声望的每个人都可以使用“远程登录并找出错误”按钮。 – Ingo 2013-02-28 10:15:16