通过 Java 使用 cmd 执行 Haskell 文件

Executing a Haskell file with cmd through Java

我正在做一个项目,我需要通过 cmd 编译和执行一个 Haskell 文件,我 start/control 和 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-function(testfunction) 我试着写“..."test.hs", "testfunction 2");”还有更多方式,但是当我添加其中任何一种时,我无法加载它。请告诉我如何修复它并使其运行。 谢谢你的时间

如果您的文件 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,很像 IPythonirb,它并不意味着 运行 将源文件作为脚本.您也不能只将 .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 将简单地编译和 运行 你的代码一步。