我第一次玩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 `='
有人可以指点我的方向吗?
答案 0 :(得分:29)
来自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
答案 1 :(得分:6)
The golden rule of indentation:作为某个表达式一部分的代码应该比该表达式的开头进一步缩进(即使表达式不是该行的最左边元素)。 / p>
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|
无需大括号或分号。