Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
length content `seq` do ...
import System.IO
main = do
c <- withFile "1.txt" ReadMode $ hGetContents
withFile "1.txt" WriteMode $ \h -> hPutStr h $ "<" ++ c ++ ">"
Но давайте вспомним, для чего были придуманы монады. Разве не для того, чтобы представить программу, как некоторую чистую функцию, которая берет на вход состояние внешнего мира, и выдает на выход новое состояние?
Это значит, что мы можем отложить вычисление «на потом», и результат от этого не изменится
foo = do
putStrLn "Hello, "
putStrLn "World"
bar = do
putStrLn "World"
putStrLn "Hello, "
Монады уж точно не для этого «придумывали». У вас в рассуждениях телега стоит впереди лошади — это наличие монад (с синтаксическим сахаром в виде do-нотации) позволяет представлять программу в виде функции, которая выглядит императивно. А не наоборот.
То есть, вы ошибаетесь в том, что подразумеваете «неважность» порядка записи вызовов функций всегда
read разное состояние передаётся в разных примерах. Оттого и разное поведение.main = do
file <- openFile "1.txt" ReadMode
content <- hGetContents file
hClose file
print content
main = openFile "1.txt" ReadMode >>= \file ->
hGetContents file >>= \content ->
hClose file >>
print content
Ленивый hGetContents. Баг или фича? (Haskell)