Это потому, что ghci отключает буферизацию, в то время как программа, скомпилированная с ghc, имеет буферизацию строки по умолчанию. Вы можете увидеть это, запустив это:
import System.IO
main = print =<< hGetBuffering stdout
В ghci вы видите NoBuffering
, тогда как с runghc вы получаете LineBuffering
. Поскольку символ новой строки не печатается до тех пор, пока после пользовательского ввода, приглашение также не выводится.
Исправьте это, добавив hFlush stdout
после вашего приглашения (или отключите буферизацию с помощью hSetBuffering stdout NoBuffering
, но это, вероятно, плохо).