2

我正在编写一些 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)
4

2 回答 2

7

由于您没有提供完整的代码,因此涉及一些猜测,但此错误可能表明您的行iLength = ...没有正确缩进;其实,那个iLength开头的右边length =行了。

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

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

将被解释为

        where length = ...
                  iLength = ...

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

于 2013-06-01T07:31:46.783 回答
4

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

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

于 2013-06-01T07:31:01.213 回答