通过Java使用cmd执行Haskell文件

时间:2015-01-09 14:34:41

标签: java haskell cmd

我正在开发一个项目,我需要在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");"还有很多方法,但是当我添加任何这些时,我无法加载它。请告诉我如何解决它并使其运行。 感谢你的时间

1 个答案:

答案 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,非常类似于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只需要一步编译和运行你的代码。