Ответ 1
Это больше похоже на буферизацию, чем на проблему последовательности. На какой платформе вы работаете? Вы пытались форсировать небуферизованный выход?
hSetBuffering stdout NoBuffering -- from System.IO
Один мой друг спросил меня, почему я изучал Хаскелла. Чтобы продемонстрировать мощь Haskell, я написал небольшую программу, которая отображает список простых чисел:
main = do
putStr "Enter the number of prime numbers to display: "
number <- fmap read getLine :: IO Int
print . take number . filter isPrime $ [2..]
isPrime :: Integer -> Bool
isPrime n = not . any ((== 0) . mod n) $ [2..floor . sqrt . fromInteger $ n]
Программа работает как ожидалось, сохраняя незначительную аномалию. Он печатает приглашение после ввода номера пользователя от пользователя, в результате чего вывод выглядит следующим образом:
12
Enter the number of prime numbers to display: [2,3,5,7,11,13,17,19,23,29,31,37]
Почему Haskell не упорядочивает действия IO правильно? Где я ошибаюсь?
Это больше похоже на буферизацию, чем на проблему последовательности. На какой платформе вы работаете? Вы пытались форсировать небуферизованный выход?
hSetBuffering stdout NoBuffering -- from System.IO
stdin
и stdout
- это два разных файла, которые не требуют подключения. Возьмите, например, команда оболочки Unix grep
:
$ seq 1 100 | grep 2$ | less
seq 1 100
печатает числа от 1 до 100 до stdout
, которые grep
stdin
(|
соединяет stdout
одной команды с stdin
другого). grep
затем записывает строки, соответствующие данному регулярному выражению, в его stdout
, который равен less
stdin
.
Чтобы заставить писать stdout
(или любой другой файл) использовать hFlush
из System.IO
:
hFlush stdout