Подтвердить что ты не робот

Почему Хаскелл не выполняет эти действия?

Один мой друг спросил меня, почему я изучал Хаскелла. Чтобы продемонстрировать мощь 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 правильно? Где я ошибаюсь?

4b9b3361

Ответ 1

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

hSetBuffering stdout NoBuffering -- from System.IO

Ответ 2

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