Haskell - синтаксис в блоках do (с использованием IO) - PullRequest
2 голосов
/ 02 января 2012

Компилятор сообщает

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)

1 Ответ

6 голосов
/ 02 января 2012

Ваш отступ, вероятно, испорчен из-за смешанных пробелов и пробелов. На самом деле в вашем фрагменте кода, похоже, есть нечетная вкладка, которую, я полагаю, вы вставили непосредственно из исходного файла.

Скорее всего, GHC интерпретирует вкладки иначе, чем их отображает ваш редактор, поэтому считает, что блок do заканчивается после рассматриваемой строки.

Как правило, в Haskell лучше использовать только пробелы. Язык определяет очень специфические правила для интерпретации вкладок, с которыми большинство редакторов кода не согласны, но пробелы однозначны и последовательны.

...