2014-08-27 87 views
0

我试图让文件作为这样的论点:如何将参数传递给haskell中的函数?

main = do 
(file1:file2:file3:_) <- getArgs 
checkdata 
command <- getLine 
runQuery(words command) 

问题是这样的runQuery(字命令)不能识别这些参数。

runQuery ("queryname":parameter1:parameter2) = do 

myfile1 <- readFile file1 
myfile2 <- readFile file2 
myfile3 <- readFile file3 

我得到的错误是:

Not in scope: file1 
.... 

我怎样才能将它们传递到功能,如我意?请帮忙。

+0

我不知道代码应该做什么。 – 2014-08-27 22:36:11

+2

这个问题对我来说似乎很清楚。确实没有遵循提出问题的标准“最佳实践”,但似乎有足够的信息*可以给出一个很好的答案。对于问题提供者:在未来,应该给出一个完整的,最小的代码示例(以便读者可以在家玩)以及编译器错误的确切副本(以便读者可以关注他们知道如何解决)。 – 2014-08-27 22:43:47

+0

感谢您的反馈Daniel,我对这个网站(和haskell)完全陌生,但我会牢记这一点。干杯。 – newb1849 2014-08-27 23:45:44

回答

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 
... 
+0

那很简单。谢谢。 – newb1849 2014-08-27 23:46:32

1

在Haskell中,函数参数用空格分隔简单,所以如果你有一个函数定义为

runQuery queryName param1 param2 = <implementation> 

您将拥有一个名为runQuery的三个参数的函数,其参数queryName,param1param2。然后,您可以传递参数以相同的语法:

main = do 
    (name:param1:_) <- getArgs 
    param2 <- getLine 
    runQuery name param1 param2 

在这里,我们的论据nameparam1,并param2,这是从getArgsgetLine获得调用函数runQuery

请注意,:字符是一个运算符,它与函数调用语法无关,其目的是通过在现有列表的前面添加一个元素来构造一个新列表。既然它也是一个构造函数,它可以用于模式匹配,因此它在(name:param1:_) <- getArgs中使用。 _是一种匹配任何内容的通配符模式,因此它代替了“在命令行中传入的其余参数”。

您似乎也对Haskell中的范围界定感到困惑。我强烈建议你在开始Haskell时阅读一些教程,我最喜欢的是Learn You a Haskell For Great Good,在尝试更复杂的程序之前,可以更熟悉该语言的基本语法和语言规则。

+0

感谢您的回答。 – newb1849 2014-08-27 23:47:35

相关问题