我是Haskell的新手,我遇到了一件我似乎可以来的事情。所以我有这个功能:
merge :: [Int] -> [Int]
merge xs = merged ++ padding
where padding = replicate (length xs - length merged) 0
merged = combine (filter (/= 0) xs)
combine (x:y:xs) | x == y = x * 2 : combine xs
| otherwise = x : combine (y:xs)
combine x = x
问题在于我无法完全理解组合的作用。我做了我的研究并发现了
myFunction(x:xs) ...
表示“x”在某种程度上是我的列表的头部,我可以用它来做,对吗?这是否意味着myFunction(x:y:xs) ...
“x”是最后一个元素,“y”是xs中最后一个元素的第二个元素吗?这是对的还是我非常错?还是“| x == y = x * 2”之后的“:”怎么样? ,我在Haskell中了解到:“”意味着将一个值附加到列表中,但在这种情况下,我真的不能完全理解它的作用......一些帮助会有很大的帮助。
答案 0 :(得分:7)
x:y:xs
是一种模式,表示"这是一个至少包含2个元素的列表。我们将调用此列表x和y的第一个和第二个元素。剩下的子列表,我们称之为xs可能是空的或非空的"。也就是说,它代表列表[1,2]和[1,2,3,4 .....]但不代表[1]。
您的第二个查询可以通过重写来回答
| x == y = x * 2 : combine xs
as
| (x == y) = ((x * 2) : combine xs)
为清楚起见。这是一个标准的if-else流程,除了Haskell不要求你明确地放置这些括号。请注意,'管道'被称为guards,其工作方式类似于Java / C#中的switch-case语句。