附加两个列表,但得到一个解析错误

时间:2013-06-26 12:13:04

标签: haskell

你好我是Haskell的新手并创建了这个代码来附加两个列表。 但我会得到一个解析错误。我做错了什么?

import Data.List

-- list a + list b = list c
joinList :: [a] -> [a] -> [a]
joinList a + b = c
 where 
    a = ["example1","example2","example3"] 
    b = ["example4","example4","example5"]
    c = a ++ b

错误:

test2.hs:5:1: `Parse error in pattern: joinList`

2 个答案:

答案 0 :(得分:6)

如果你使它成为一个“常量”函数,一个不带任何参数的函数,那么调用它(如函数“main”)将执行你似乎想到的计算。

joinList :: [a]
joinList = c
 where 
    a = ["example1","example2","example3"] 
    b = ["example4","example4","example5"]
    c = a ++ b

main = print joinList

另一方面,常数函数并不常见。也许你想到的是两个调用append(++)的参数的函数。

joinList :: [a] -> [a] -> [a]
joinList a b = c
 where 
    c = a ++ b

main = print $ joinList a b
 where 
    a = ["example1","example2","example3"] 
    b = ["example4","example4","example5"]

当然还有很多其他的可能性。我希望这两个给你一般的想法,以便你可以到达你想去的地方。

答案 1 :(得分:5)

这里的问题非常简单。在Haskell中,函数声明如下所示:

<function-name> <function-arg-name>* = <body>

在你的情况下,你有

<function-name> === joinList
<function-arg-name1> === a

到目前为止一直很好,但是你有+,Haskell不会将其解析为名称,因此它会显示一个解析错误。要解决这个问题很简单:删除+,你会没事的。

更大的问题是你有一个where子句重新定义了所有的函数参数名。如果您希望您的函数正常工作:您还必须删除该where子句。最终结果是

joinList a b = a ++ b

如果你真的想成为haskell-y,你可以写

joinList = (++)