myFunction(x:y:xs)在Haskell中的含义是什么?

时间:2016-05-24 11:19:23

标签: haskell

我是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中了解到:“”意味着将一个值附加到列表中,但在这种情况下,我真的不能完全理解它的作用......一些帮助会有很大的帮助。

1 个答案:

答案 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语句。