3

それで、私は本Real World Haskellから Haskell を独学し始めたところです。演習の 1 つを行う過程で、次のコードを書きました。

step acc ch | isDigit ch = if res < acc   
                              then error "asInt_fold: \
                                         \result overflowed"
                              else res
                      where res = 10 * acc + (digitToInt ch)
            | otherwise  = error ("asInt_fold: \
                                  \not a digit " ++ (show ch))

それを GHCi 6.6 にロードすると、次のエラーが発生しました。

IntParse.hs:12:12: parse error on input `|'
Failed, modules loaded: none.

エラーが「where」句とそれに続くガードの相互作用によるものであることはほぼ確実です。ガードをコメント アウトすると、"where" 句を同等の "let" 句に置き換えるのと同様に、ガードが削除されます。また、どうにかしてインデントを台無しにしたに違いないと確信していますが、その方法を整理することはできません。

ヒントをお寄せいただきありがとうございます。

4

2 に答える 2

11

whereガードの間に配置することはできません。Haskellレポートのパラグラフ4.4.3.1関数バインディングから。

于 2009-08-22T15:59:32.957 に答える
9

試す:

step acc ch
    | isDigit ch = if res < acc then error "asInt_fold: result overflowed" else res
    | otherwise  = error ("asInt_fold: not a digit " ++ (show ch))
    where res = 10 * acc + (digitToInt ch)
于 2009-08-22T15:30:54.297 に答える