Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.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
Bash Haskell Noob需要帮助_Bash_Haskell - Fatal编程技术网

Bash Haskell Noob需要帮助

Bash Haskell Noob需要帮助,bash,haskell,Bash,Haskell,这有点长,请容忍我 我在使用Haskell程序时遇到了一些问题,我必须将其作为uni项目的一部分使用。仅供参考 所以,您应该执行一个脚本,它实际上是一个Bash脚本来调用Hugs解释器,如下所示: exec $HUGSBIN/hugs $HUGSARGS +p"Casper> " $FILES >main = do > args <- getArgs > case args of > [] -> putStrLn "What

这有点长,请容忍我

我在使用Haskell程序时遇到了一些问题,我必须将其作为uni项目的一部分使用。仅供参考

所以,您应该执行一个脚本,它实际上是一个Bash脚本来调用Hugs解释器,如下所示:

exec $HUGSBIN/hugs $HUGSARGS +p"Casper> " $FILES
>main = do
>    args <- getArgs
>    case args of
>        [] -> putStrLn "What file did you want me to compile?"
>        [filename] -> compile filename
>        _ -> putStrLn "I only compile one file at a time."
其中$FILES指向Main.lhs文件

在此之后,我需要在解释器中调用一个函数“compile”,其中包含一个文件路径

我需要以脚本的方式执行上述操作。我需要自动化,因为我正在编写一个程序,在后台调用Casper

所以我编译了.lhs文件。现在我想执行“compile”函数,但我不知道如何执行。我尝试:

./Main compile <a path>
第二行解决了这个问题。现在我的问题是,在编译main.lhs之后,如何调用“compile”函数并传递到它的路径?在解释器中,我只需输入“compile”就可以了,但是在编译main.lhs并从命令行执行之后,我就不能让它正常工作了?你知道为什么吗?如果其他一切都失败了,我有没有办法写下拥抱的脚本


谢谢你的帮助

您可以通过
getArgs
访问传递给Haskell程序的命令行参数。例如,听起来您需要一个主函数来执行以下操作:

exec $HUGSBIN/hugs $HUGSARGS +p"Casper> " $FILES
>main = do
>    args <- getArgs
>    case args of
>        [] -> putStrLn "What file did you want me to compile?"
>        [filename] -> compile filename
>        _ -> putStrLn "I only compile one file at a time."
>main=do
>args的案例args
>[]->putStrLn“您希望我编译什么文件?”
>[文件名]->编译文件名
>->putStrLn“我一次只编译一个文件。”

根据口味进行修改。

您可以通过
getArgs
访问传递给Haskell程序的命令行参数。例如,听起来您需要一个主函数来执行以下操作:

exec $HUGSBIN/hugs $HUGSARGS +p"Casper> " $FILES
>main = do
>    args <- getArgs
>    case args of
>        [] -> putStrLn "What file did you want me to compile?"
>        [filename] -> compile filename
>        _ -> putStrLn "I only compile one file at a time."
>main=do
>args的案例args
>[]->putStrLn“您希望我编译什么文件?”
>[文件名]->编译文件名
>->putStrLn“我一次只编译一个文件。”

根据口味进行修改。

main
替换为

 main = getArgs >>= \(arg1:_) -> compile arg1
这将把第一个命令行参数(
arg1
)传递给
compile
,而不是“test”,并忽略其余的(
)。您可能需要添加

 import System


我记不起拥抱需要什么了。

main
替换为

 main = getArgs >>= \(arg1:_) -> compile arg1
这将把第一个命令行参数(
arg1
)传递给
compile
,而不是“test”,并忽略其余的(
)。您可能需要添加

 import System


我记不起拥抱需要什么了。

我得到这个:Main.lhs:31:9:不在范围内:'getArgs'。想法?]是“>导入系统。环境”。我使用Daniel Wagner的代码,因为它对我来说更清晰。但你的也行!谢谢我得到这个:Main.lhs:31:9:不在范围内:`getArgs'。想法?]是“>导入系统。环境”。我使用Daniel Wagner的代码,因为它对我来说更清晰。但你的也行!谢谢成功了!谢谢!你能解释一下你的代码是做什么的吗?我有点明白,只是我不熟悉哈斯克尔。我特别想知道最后三行是什么意思。我假设:空字符串,打印消息。如果提供了arg,则将其称为“filename”并称为“compilefilename”。如果有多个参数,请告诉最后一条消息?@Inf.S:基本正确
getArgs
是一个提供命令行参数列表的操作。第一行将此列表绑定到名称
args
。一个列表可以有数量可变的元素,因此最后几行在列表上进行模式匹配,以了解如何继续。如果
args
与空列表匹配,则打印消息。如果args将列表与单个元素匹配,则调用该元素
filename
,然后继续编译该文件。最后一行使用
\u
进行匹配。这是一个总是成功的特例匹配,但模式匹配的规则是尝试从上到下匹配(cont.)@Inf.S:(cont'ed)因此,如果进行了匹配,则表示前两行不匹配,因此它必须是两个或更多元素的列表。如果最后一行是的
case args之后的第一行,那么该程序将只打印
“我一次只编译一个文件”
,无论它得到多少个参数。这是有效的!谢谢!你能解释一下你的代码是做什么的吗?我有点明白,只是我不熟悉哈斯克尔。我特别想知道最后三行是什么意思。我假设:空字符串,打印消息。如果提供了arg,则将其称为“filename”并称为“compilefilename”。如果有多个参数,请告诉最后一条消息?@Inf.S:基本正确
getArgs
是一个提供命令行参数列表的操作。第一行将此列表绑定到名称
args
。一个列表可以有数量可变的元素,因此最后几行在列表上进行模式匹配,以了解如何继续。如果
args
与空列表匹配,则打印消息。如果args将列表与单个元素匹配,则调用该元素
filename
,然后继续编译该文件。最后一行使用
\u
进行匹配。这是一个总是成功的特例匹配,但模式匹配的规则是尝试从上到下匹配(cont.)@Inf.S:(cont'ed)因此,如果进行了匹配,则表示前两行不匹配,因此它必须是两个或更多元素的列表。如果最后一行是
case args之后的第一行,那么程序将只打印
“我一次只编译一个文件”
,无论它得到多少个参数。