文件夹在这种情况下如何工作?

how does foldr workk in this situation?

我有这个函数可以计算 n 在列表中出现的次数:

count n = foldr (\x acc -> if n == x then acc+1 else acc) 0

现在如果我这样做

> count 2 [2,2,3,2,2]
> 4

我不明白的是为什么我不能改为执行以下操作 我发现它更容易阅读

count n [x:xs] = foldr (\x acc -> if n == x then acc+1 else acc) 0 [x:xs]

count 有两个参数,但为什么在定义函数时我没有明确写出第二个参数(列表参数)它去哪里​​了?

[x:xs] 模式是 [(x:xs)] 的缩写,这意味着 单例 列表(具有一个元素的列表)匹配 (x:xs) 模式。

(x:xs) 模式是一个 non-empty 列表。实际上,这里 xhead(第一个元素),而 xstail(带有剩余元素)。空列表的模式是 []。如果你这样写:

-- does not work with empty lists
count n <b>(x:xs)</b> = foldr (\x acc -> if n == x then acc+1 else acc) 0 <b>(x:xs)</b>

这意味着它不会为空列表“触发”。但是,您可以使用参数:

count n <b>xs</b> = foldr (\x acc -> if n == x then acc+1 else acc) 0 <b>xs</b>

这是一个可以与任何值匹配的变量,因此既可以是空列表也可以是 non-empty 列表。