文件夹在这种情况下如何工作?
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 列表。实际上,这里 x
是 head(第一个元素),而 xs
是 tail(带有剩余元素)。空列表的模式是 []
。如果你这样写:
-- 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 列表。
我有这个函数可以计算 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 列表。实际上,这里 x
是 head(第一个元素),而 xs
是 tail(带有剩余元素)。空列表的模式是 []
。如果你这样写:
-- 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 列表。