3

コンパイラは言う

The last statement in a 'do' construct must be an expression:
rmax <- getInteger

次のコードスニペットを含むファイルを読み込もうとした場合:

getInteger :: IO Integer
getInteger = readLn

main :: IO ()
main = do  
    putStrLn "specify upper limit of results"  
    rmax <- getInteger
    if rmax `notElem` mot
        then do putStrLn "run again and enter a multiple of 10"
        else do print pAllSorted

それ(コンパイラメッセージ)はどういう意味ですか、そしてなぜここで発生するのですか?(それはありませんが:)

main = do   
    line <- getLine  
    if null line  
        then return ()  
        else do  
            putStrLn $ reverseWords line  
            main  

reverseWords :: String -> String  
reverseWords = unwords . map reverse . words  

(上記の例はhttp://learnyouahaskell.com/input-and-outputから取得)

4

1 に答える 1

7

タブとスペースが混在しているため、インデントが混乱している可能性があります。実際、質問のコードスニペットに迷子のタブがあるようです。これは、ソースファイルから直接貼り付けたと想定しています。

ほとんどの場合、GHCはタブをエディターの表示方法とは異なる方法で解釈しているためdo、問題の行の後でブロックが終了していると見なします。

経験則として、Haskellではスペースのみを使用するのが最善です。この言語は、ほとんどのコードエディタが同意しないタブを解釈するための非常に具体的なルールを定義していますが、スペースは明確で一貫性があります。

于 2012-01-02T11:22:08.847 に答える