Вы всегда можете использовать явные скобки с { ; }
, чтобы никогда не беспокоиться об этой глупости.
printFile :: Handle -> IO ()
printFile handle = do {
end <- hIsEOF handle ;
if end
then return ()
else do { line <- hGetLine handle ;
putStrLn line ;
printFile handle }}
было бы полностью нормально (как, не вызывать ошибку).
Ввод / вывод обрабатывается через специальный язык "do
" в Haskell. Это следует принять. То, что это на самом деле реализовано с помощью монад, является деталью реализации.
Чтобы уточнить: я не думаю, что скобки лучше, я думаю, что они должны идти вместе с красивым и последовательным отступом. Скобки дают нам хорошие и непосредственные визуальные подсказки относительно структуры кода. Дикие отступы, конечно, будут бесполезным отвлечением большую часть времени. Кроме того, фигурные скобки дают нам гарантию на работоспособность кода и избавляют нас от бессмысленных забот о случайных ситуациях. Они устраняют эту хрупкость.