4

以下の Haskell コードでは、「入力 'in' の解析エラー」というエラーが表示されます。私が読んだことから、私が使用したインデントは問題ないはずです。実際、コードの他の場所では、'let' と 'in' を同様のインデント ('let' を 'in' に揃える) で使用しています。この「イン」が問題になる原因となる、私が破ったルールは何ですか? 'in' の前にスペースを追加すると ('let' よりも 1 スペース分長くする)、正常にコンパイルされます。

runTests :: IO ()
runTests = do
             let results = fmap testLispExpr testLispText
                 resultStrings = fmap show results
                 putSeq (x:xs) = do putStrLn x
                                    putSeq xs
                 putSeq [] = return ()
             in putSeq resultStrings

すべての助けに感謝します。前もって感謝します。

4

1 に答える 1

7

letブロックの構文はdo少しおかしいです。を使用する場合inは、 の右側にインデントする必要がありますletinまたは、を完全に省略することもできます。そうすれば、ブロックletの残りの部分でバインディングが表示されます。do

           do
             let ....
                 ....
             putSeq resultStrings
         --  ..... (more `do` statements)
         --  ^^ must all start on the same column

編集

Ørjan Johansen が指摘してdoいるように、 の後にステートメントが 1 つしかないため、この場合、 は実際にはまったく必要ありませんlet。したがって、他のオプションは、キーワードdoを保持しながらを省略することです。inまた、次のように書くこともできます。

runTests = mapM (print . testListExpr) testLispText

そして本当に物事をきれいにします。

于 2015-02-11T07:45:14.247 に答える