Потому что это не то, что вы просили. Поскольку
prompt = (getLine <*) . (hFlush stdout <*) . putStrLn
, мы можем просто добавить аргумент, чтобы увидеть, что мы получаем:
prompt str = ((getLine <*) . (hFlush stdout <*) . putStrLn) str
= getLine <* hFlush stdout <* putStrLn str
Это просит выполнить действия getLine
, hFlush stdout
и putStrLn str
,в этой последовательности. (Тогда результатом результата этой последовательности действий будет то значение результата, которое getLine
имело в самом начале.) Вместо этого вы хотите:
prompt str = putStrLn str *> hFlush stdout *> getLine
или:
prompt = (*> getLine) . (*> hFlush stdout) . putStrLn
(Фактически, буферизацией по умолчанию в большинстве случаев является строковая буферизация или меньше, и вы звоните putStrLn
, а не putStr
, поэтому none этих решений на самом деле требуется вызов hFlush stdout
!)