-3

你好,我是 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`
4

2 回答 2

6

如果您将其设为“常量”函数,即不带任何参数的函数,那么调用它(如在函数“main”中)将执行您似乎想到的计算。

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

main = print joinList

另一方面,常量函数并不是很常见。也许您想到的是调用附加 (++) 的两个参数的函数。

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"]

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

于 2013-06-26T12:28:13.100 回答
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 = (++)
于 2013-06-26T12:23:49.787 回答