我试图将文件作为这样的参数:
main = do
(file1:file2:file3:_) <- getArgs
checkdata
command <- getLine
runQuery(words command)
问题是这个runQuery(words命令)无法识别这些参数。
runQuery ("queryname":parameter1:parameter2) = do
myfile1 <- readFile file1
myfile2 <- readFile file2
myfile3 <- readFile file3
我得到的错误是:
Not in scope: file1
....
如何将它们传递给我想要的功能?请帮忙。
答案 0 :(得分:2)
您必须像其他函数参数一样将file1
等传递给runQuery
:
main = do
(file1:file2:file3:_) <- getArgs
checkdata
command <- getLine
runQuery file1 file2 file3 (words command)
runQuery file1 file2 file3 ("queryname":parameter1:parameter2) = do
...
答案 1 :(得分:1)
在Haskell中,函数参数只是用空格分隔,所以如果你有一个定义为
的函数runQuery queryName param1 param2 = <implementation>
你将拥有一个名为runQuery
的三个参数的函数,其参数为queryName
,param1
和param2
。然后,您将使用相同的语法传递参数:
main = do
(name:param1:_) <- getArgs
param2 <- getLine
runQuery name param1 param2
我们在这里调用函数runQuery
,其参数name
,param1
和param2
来自getArgs
和{{1} }。
请注意,getLine
字符是一个运算符,它与函数调用语法无关,其目的是通过将元素添加到现有列表的前面来构造新列表。由于它也是构造函数,因此可以用于模式匹配,因此可以在:
中使用它。 (name:param1:_) <- getArgs
是一个匹配任何内容的通配符模式,因此它取代了#34;其余的args在命令行传入#34;。
你似乎也对Haskell中的作用域感到困惑。我强烈建议您阅读一些关于开始Haskell的教程,我最喜欢的是Learn You a Haskell For Great Good,以便在尝试更复杂的程序之前更熟悉该语言的基本语法和语言规则。