4

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 相比,Frege 不打印第二行(使用putStr而不是putStrLn)。这种缺少冲洗的行为是有意的吗?

如果 Frege 偏离了 Haskell 的行为,我会假设它是模仿 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-Plugin 以及 IntelliJ/Gradle 重现。

4

1 回答 1

5

您的 Java 代码使用 System.out,它是一个 PrintStream。Frege 代码使用 PrintWriter。

这两个类在冲洗方面的工作方式略有不同。来自 PrintWriter 的文档:

与 {@link PrintStream} 类不同,如果启用了自动刷新,它将仅在调用 println、printf 或格式方法之一时完成,..

因此,对于您的 Frege 代码,您必须在之后添加一个stdout.flushprint使其立即出现。

随时提出问题,要求在这方面使 Frege 与 Haskell 行为保持一致。(我们可以保持print原样,但自动putStr添加flush。)

于 2015-07-31T10:30:34.603 回答