Фреговое поведение 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 автоматически.)

Другие вопросы по тегам