Haskell 为什么GHCi在where条款中抱怨?

Haskell 为什么GHCi在where条款中抱怨?,haskell,syntax,Haskell,Syntax,当我编写这样的代码时: Prelude> let f = (+1) . (*k) Prelude| where k = 2 Prelude| 我犯了这样一个错误: <interactive>:46:5: parse error on input 'where' :46:5:输入“where”时分析错误 这是因为您试图在提示符下定义多行函数。您可以查看此链接以了解如何执行此操作: 但是请注意,这可能不适用于所有版本。我有GHC 7.4.2版,面临同样的问题 对于多行

当我编写这样的代码时:

Prelude> let f = (+1) . (*k)
Prelude|     where k = 2
Prelude|
我犯了这样一个错误:

<interactive>:46:5: parse error on input 'where'
:46:5:输入“where”时分析错误

这是因为您试图在提示符下定义多行函数。您可以查看此链接以了解如何执行此操作:

但是请注意,这可能不适用于所有版本。我有GHC 7.4.2版,面临同样的问题

对于多行函数定义,可以使用
+m
标志,如下所示:

Prelude> :set +m
Prelude> let f = (+1) . (*k)
Prelude|       where k = 2
Prelude|
这对我的系统有效

否则,您可以将函数拆分为2个,如下所示:

let k = 2
let f = (+1) . (*k)

我也有7.4.2,我总是使用多行模式,包括这个例子。我做错了什么?你可能想比较一下我和你版本中的缩进。我怀疑这就是原因。是的!这就是重点。我不知道“where”应该缩进到prev中的“=”级别。第行。@AndrewVershin规则中的规则是,它必须缩进到定义它的函数名的开头。由于
let
f
之间只有一个空格,因此
let f
中总共有5个字符,因此
的前面必须至少有5个空格。请注意,对于好的样式,大多数人都建议将
where
缩进一个超出名称
f
开头的额外缩进级别,因此因为我使用4个空格作为缩进,所以我会在
where
前面加8个空格。