通过 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,很像 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
将简单地编译和 运行 你的代码一步。
我正在做一个项目,我需要通过 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,很像 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
将简单地编译和 运行 你的代码一步。