Mam następujący kod:kolejność wykonywania Haskell IO
import Control.Monad (unless)
import System.IO (isEOF, hFlush, stdout)
main :: IO()
main = unlessFinished $ do
putStr "$ "
hFlush stdout
getLine >>= putStrLn
main
where
unlessFinished action = isEOF >>= flip unless action
Kiedy skompilować i uruchomić ten kod, to wyświetla kursor na początku pustej linii i dopiero po I hit [Enter] go wyprowadza $
i cokolwiek napisałem.
Wydaje się, że getLine
jest wywoływana przed putStr "$ "
nawet tych IO
gwarancji monady, że to działania są nazywane w kolejności są one sekwencjonowanym w kodzie (przynajmniej tak mi zrozumieć, co jest napisane here). Dlaczego więc nie działa poprawnie?
nawiasem mówiąc, tak naprawdę nie wierzył, dopóki próbowałem uruchomieniem kodu siebie. Wtedy rzeczywiście powiedziałem "co ...?!" głośno w mojej klitce. Niezła robota, oddająca twoje pytanie w tak ładną, strawną, zaskakującą formę! –
Dziękuję. Zaskoczyło mnie to również. Właściwie to zaczynałem wierzyć, że to nie "wina" Haskella, ale jakaś inna pułapka powłoki/terminalu/OS, o której wcześniej nie wiedziałem. :) – Sventimir