Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用java编写的简单haskell脚本_Java_Haskell - Fatal编程技术网

用java编写的简单haskell脚本

用java编写的简单haskell脚本,java,haskell,Java,Haskell,尝试使用java代码在Haskell中运行一个简单脚本。(视窗10) haskell脚本如下所示: import Data.Char(toUpper) main = interact (map toUpper) 我用ghc制作了一个简单的.exe文件,它在cmd模块中可以正常工作。我写了一个简单的字符串,它用同样的大写字符串回复,我可以重复这个过程,直到我选择停止程序 但是,当我试图通过java运行这个程序时,它不会以这种方式工作。我可以输入,但是为了得到输出,我需要关闭输入 public c

尝试使用java代码在Haskell中运行一个简单脚本。(视窗10)

haskell脚本如下所示:

import Data.Char(toUpper)
main = interact (map toUpper)
我用ghc制作了一个简单的.exe文件,它在cmd模块中可以正常工作。我写了一个简单的字符串,它用同样的大写字符串回复,我可以重复这个过程,直到我选择停止程序

但是,当我试图通过java运行这个程序时,它不会以这种方式工作。我可以输入,但是为了得到输出,我需要关闭输入

public class Main {
    public static void main(String[] args) {
        try {
            Process process = new ProcessBuilder("simple").start();

            InputStream processInputStream = process.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(processInputStream));
            OutputStream processOutputStream = process.getOutputStream();
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(processOutputStream));
            char[] bt = ("Hello").toCharArray();
            writer.write(bt);
            writer.flush();
            writer.newLine();
            processOutputStream.close(); -- Only works if I close output stream,.
            System.out.println(reader.readLine());


        }catch (IOException e) {
            e.printStackTrace();
        }
    }
}
如何在java程序中关闭输出提要时获得输出

重新启动进程是可行的,但执行时间很糟糕


我已尝试对程序执行线程处理,但结果相同。

BufferedWriter
在执行
newLine()
时不会自动刷新其输出。因此,您的Haskell程序将不会收到换行符并永远等待

当您调用
close()
时,所有剩余的缓冲输出都被刷新(当然,您不想这样做)

因此,解决方案应该是

writer.write(bt);
writer.newLine();
writer.flush();
您还可以使用
PrintWriter
,它有一个自动刷新换行选项,可以理解字符串(通过
print
方法),因此无需处理
char[]


最后,如果您计划同时发送大量文本,则可能必须调整缓冲区大小或使用多个线程,以避免程序无法再发送输出时出现死锁,因为接收Java端缓冲区已满,而您当前没有读取它。有关解决方案,请参见此。

我做了一些实验,需要在Haskell端进行行缓冲,否则输出不会及时刷新

import Data.Char(toUpper)
import System.IO

main = do
  hSetBuffering stdout LineBuffering
  interact (map toUpper)
事实上,我发现当从java调用时,
stdout
最初设置为
BlockBuffering
,这将导致缓冲区过多


请注意,正如Thilo所指出的,为了在Haskell端使用
LineBuffering
,您必须在刷新(java)之前在java端使用
writer.newLine()
,否则大写输出将不会刷新(Haskell)。

您也尝试过Haskell端的@chi更改吗?谢谢。我仍然无法让它工作,在最后增加了同花顺。Printwriter和flush没有任何区别。如果没有冲水,关闭时甚至不会有结果。我会尝试他的解决方案,然后回来。谢谢:)您可以使用eta将haskell脚本编译成jar,并直接从java调用