Фреговое поведение putStr отличается от Haskell или Java
Предположим, вы запрашиваете ввод пользователя с помощью комбинации putStr
а также getLine
:
main = do
putStrLn "A line with line termination" -- printed correctly
putStr "A line without line termination, e.g. to prompt for input: " -- NOT printed
line <- getLine
putStrLn ("You entered: " ++ line)
В отличие от Haskell, Фреге не печатает 2-ю строку (которая использует putStr
скорее, чем putStrLn
). Предназначено ли это поведение отсутствующего флеша?
Если Фреге отклоняется от поведения Хаскеля, я бы предположил, что оно имитирует поведение Java. Концептуально похожий пример:
public static void main(String[] args) {
System.out.println("A line with line termination");
System.out.print("A line without line termination, e.g. to prompt for input: ");
String line = new java.util.Scanner(System.in).nextLine();
System.out.println("You entered: " + line);
}
Это, однако, ведет себя как вариант Haskell, то есть System.out.print
покраснела сразу.
Заранее спасибо за любые отзывы!
PS: (неправильно?) Поведение может быть воспроизведено с последним Eclipse-плагином, а также IntelliJ/Gradle.
1 ответ
Ваш код Java использует System.out, который является PrintStream. Код Фреге использует PrintWriter.
Эти два класса работают немного по-разному в отношении смыва. Из документов PrintWriter:
В отличие от класса {@link PrintStream}, если автоматическая очистка включена, это будет выполняться только при вызове одного из методов println, printf или format,..
Так что для вашего кода Фреге, вы должны добавить stdout.flush
после print
чтобы он появился сразу.
Не стесняйтесь подавать проблему с просьбой привести Frege в соответствие с поведением Haskell в этом отношении. (Мы могли бы оставить print
как есть, но сделать putStr
добавить flush
автоматически.)