【问题标题】:Haskell syntax error for where statement [duplicate]where语句的Haskell语法错误[重复]
【发布时间】:2013-06-01 07:03:22
【问题描述】:

我正在编写一些 Haskell 代码来学习该语言,但遇到了语法错误:

Vec2.hs:33:27: parse error on input '='

我在这里写的代码如下。错误指向vec2Normalize iLength = ... 中的第二个术语我没有看到语法错误

-- Get the inverse length of v and multiply the components by it
-- Resulting in the normalized form of v
vec2Normalize :: Vec2 -> Vec2
vec2Normalize v@(x,y) = (x * iLength, y * iLength)
    where length = vec2Length v
          iLength = if length == 0 then 1 else (1 / length)

【问题讨论】:

  • 这不是您粘贴的第 33 行。错误很可能在其他地方,并且仅在第 33 行报告。无论第 33 行是什么。
  • 它所在文件的第 33 行,我只发布了相关部分。当我注释掉这个函数时,错误就消失了。

标签: haskell syntax


【解决方案1】:

由于您没有提供完整的代码,因此涉及一些猜测,但此错误可能表明您的行 iLength = ... 没有正确缩进;实际上,iLength 从前一行的length =右侧开始。

您的原始文件是否使用制表符而不是空格来缩进?如果是这样,请注意 Haskell 总是将选项卡解释为跨越 8 列。所以,例如,

<TAB>where length = ...
<TAB><TAB><SPACE><SPACE>iLength = ...

将被解释为

        where length = ...
                  iLength = ...

因此导致错误,即使您的编辑器在使用 4 列制表符时可能会显示正确对齐的行。

【讨论】:

  • 是的,代码正在使用制表符。您可以通过单击问题上的“编辑”链接并尝试选择该行上的空格来判断。它也看起来就像你的第二个代码块。
  • @hammar:谢谢,我不知道。
【解决方案2】:

您正在使用制表符进行缩进,因此where 子句中的第二个定义实际上与第一个定义不一致。 Haskell 使用 8 个空格的制表符宽度,这可能与您的编辑器不同,从而导致代码看起来正常,但实际上不是这样的问题。

我强烈建议您将编辑器配置为仅在使用 Haskell 代码时使用空格。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    相关资源
    最近更新 更多