如何在GHCi中使用多个where子句?

T.R*_*.R. 19 haskell ghci

我第一次玩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| :}
Run Code Online (Sandbox Code Playgroud)

它给出以下错误:

<interactive>:1:142: parse error on input `='
Run Code Online (Sandbox Code Playgroud)

有人可以指出我的方向,我错过了什么?

ken*_*ytm 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| :}
Run Code Online (Sandbox Code Playgroud)

编辑:在最近的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
Run Code Online (Sandbox Code Playgroud)


tho*_*mie 6

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

Prelude> :set +m
Run Code Online (Sandbox Code Playgroud)

错误:

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

<interactive>:3:1:
    parse error in let binding: missing required 'in'
Run Code Online (Sandbox Code Playgroud)

对:

Prelude> let foo = x
Prelude|      where x = 1
Prelude| 
Run Code Online (Sandbox Code Playgroud)

不需要括号或分号.