【问题标题】:Haskell : "The last statement in a 'do' construct must be an expression"Haskell:“‘do’构造中的最后一条语句必须是表达式”
【发布时间】:2011-12-29 05:43:42
【问题描述】:

我正在阅读本书Natural Language Processing for Working Programmers。这本书使用Haskell,我没有太多经验。下面的代码在 GHCI 中抛出错误

:{
do
  l <- [0..9]
  ps <- (\x -> [x-1, x+2]) l
  return ps
:}

这是返回的错误信息

The last statement in a 'do' construct must be an expression

我遇到的所有答案似乎都表明这是一个缩进错误,但据我所知,缩进似乎是正确的。任何想法可能是什么问题?

【问题讨论】:

  • 您使用的是哪个版本的 ghci?在 Windows/OSX/Ubuntu/Fedora/...上?
  • 6.12.1 在 Ubuntu 10.04 上。这可能是问题所在?

标签: haskell


【解决方案1】:

我在 ghci 7.0.3 中输入了您的代码,没有收到错误。

Prelude> :{
Prelude| do
Prelude|   l <- [0..9]
Prelude|   ps <- (\x -> [x-1, x+2]) l
Prelude|   return ps
Prelude| :}
[-1,2,0,3,1,4,2,5,3,6,4,7,5,8,6,9,7,10,8,11]

编辑:当我使用 Ubuntu 10.04 中打包的 ghci 6.12.1 时,我得到了和你一样的错误。

【讨论】:

  • 我怀疑我的版本可能太旧了。我是从 repos 而不是 haskell 网站获得的。 6.12.1 在 Ubuntu 10.04 上。谢谢。
  • 是的,这看起来是个问题。
【解决方案2】:

:{:} 的符号不是 Haskell 的一部分,我认为这与您正在阅读的文本有关。此外,您发布的代码有一个 lambda 被用作列表单子。试试这个:

do
  l <- [0..9]
  ps <- (\x -> [x-1, x+2]) l
  return ps

【讨论】:

  • 我的印象是 :{:} 对于 GHCi 中的多行代码是必需的。错误地遗漏了列表参数,对不起。不过,我还没有完全理解单子。我应该像在 GHCi 中一样使用您的代码吗?每一行都被独立解释。
  • 我想我可能已经找到了出路,基于stackoverflow.com/a/3532505/420386。使用分号似乎可以解决问题,虽然它让我觉得有点脏:) 谢谢。
  • 对不起,我不知何故错过了你在 GHCi 中(忘记了那个语法)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-10
相关资源
最近更新 更多