Bash Haskell Noob需要帮助
这有点长,请容忍我 我在使用Haskell程序时遇到了一些问题,我必须将其作为uni项目的一部分使用。仅供参考 所以,您应该执行一个脚本,它实际上是一个Bash脚本来调用Hugs解释器,如下所示: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
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之后的第一行,那么程序将只打印“我一次只编译一个文件”
,无论它得到多少个参数。