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 コマンドで使用でき、 と の間の:{行は解釈のため:}単純に 1 行にマージされます。これは、そのような各グループがマージされたときに単一の有効なコマンドを形成する必要があり、レイアウト ルールが使用されないことを意味します。

したがって、各定義の間にセミコロンを挿入する必要があります。

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 に答える