20

我第一次玩 GHCi,我在编写多行函数时遇到了一些麻烦。我的代码如下:

Prelude> :{
Prelude| let diffSquares lst = abs $ squareOfSums lst - sumOfSquares lst
Prelude|   where
Prelude|     squareOfSums lst = (fst (sumsAndSquares lst))^2
Prelude|     sumOfSquares lst = snd (sumsAndSquares lst)
Prelude|     sumsAndSquares = foldl (\(sms,sqrs) x -> (sms+x,sqrs+x^2)) (0,0)
Prelude| :}

它给出了以下错误:

<interactive>:1:142: parse error on input `='

有人可以指出我所缺少的方向吗?

4

2 回答 2

30

来自 ghci 的帮助手册(http://www.haskell.org/ghc/docs/6.10.4/html/users_guide/interactive-evaluation.html):

这样的多行命令可以与任何 GHCi 命令一起使用,并且和之间的行:{简单:}合并为一行以进行解释。这意味着每个这样的组在合并时必须形成一个有效的命令,并且不使用布局规则

因此,您必须在每个定义之间插入分号,例如

Prelude> :{
Prelude| let a x = g
Prelude|   where
Prelude|     g = p x x;      {- # <----- # -}
Prelude|     p a b = a + b
Prelude| :}

编辑:在最新版本的 GHCi 中,您似乎需要一对大括号。

Prelude> :{
Prelude| let { a x = g
Prelude|   where
Prelude|     g = p x x
Prelude|     p a b = a + b
Prelude| }
Prelude| :}
Prelude> a 5
10
于 2010-06-18T08:17:39.380 回答
7

缩进的黄金法则作为某个表达式一部分的代码应该比该表达式的开头更缩进(即使该表达式不是该行的最左边的元素)。

Prelude> :set +m

错误的:

Prelude> let foo = x
Prelude|     where x = 1
Prelude| 

<interactive>:3:1:
    parse error in let binding: missing required 'in'

对:

Prelude> let foo = x
Prelude|      where x = 1
Prelude| 

不需要大括号或分号。

于 2015-06-24T08:29:48.190 回答