我正在开发一个项目,我需要在cmd上编译和执行Haskell文件,我用Java启动/控制它。这就是现在的样子:
public class CmdTest {
public static void main(String[] args) throws Exception {
ProcessBuilder builder = new ProcessBuilder( "cmd.exe", "/c", "cd \"C:\\Users\\ray\\Documents\\Project\" && ghci ", "test.hs");
builder.redirectErrorStream(true);
Process p = builder.start();
BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while (true) {
line = r.readLine();
if (line == null) { break; }
System.out.println(line);
}
}
}
到目前为止一切顺利。然后我尝试通过直接写在" test.hs"后面来执行我的实际haskell函数(testfunction)。我试着写#34; ..." test.hs"," testfunction 2");"还有很多方法,但是当我添加任何这些时,我无法加载它。请告诉我如何解决它并使其运行。 感谢你的时间
雷
答案 0 :(得分:1)
如果您的文件test.hs
看起来像
module Main where
testfunction :: Int -> IO ()
testFunction n = print n
main :: IO ()
main = do
testfunction 2
然后你可以使用runhaskell
命令在没有Java编译的情况下调用它:
public class CmdTest {
public static void main(String[] args) throws Exception {
ProcessBuilder builder = new ProcessBuilder(
"cmd.exe",
"/c",
"cd \"C:\\Users\\ray\\Documents\\Project\" && runhaskell ",
"test.hs");
builder.redirectErrorStream(true);
Process p = builder.start();
BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while (true) {
line = r.readLine();
if (line == null) { break; }
System.out.println(line);
}
}
}
需要注意的重要部分:
你的Haskell文件必须明确地是module Main
或者没有模块声明(它隐含Main
,但它总是好主意明确),它必须有一个名为main
的函数,类型为IO ()
,并使用runhaskell
命令。 ghci
命令用于运行交互式REPL,非常类似于IPython
或irb
,它不用于将源文件作为脚本运行。您也无法指定要运行的.hs
文件中的哪个函数,您的文件必须是可执行文件。你不会期望这适用于Java
// SayHello.java
public class SayHello {
public static void sayHello(String name) {
System.out.print("Hello, ");
System.out.println(name);
}
}
然后将其作为
运行> java SayHello.java SayHello.sayHello "World"
您必须先编译它并从某些public static void main(String[] args)
调用目标函数。对于Haskell来说也是如此,你必须有一个main
函数来运行任何东西,runhaskell
只需要一步编译和运行你的代码。