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