我第一次玩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)
缩进的黄金法则:作为某个表达式一部分的代码应该比该表达式的开头进一步缩进(即使表达式不是该行的最左边元素).
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)
不需要括号或分号.