我具有以下功能,应使用foldr
编写。
f [] = []
f (x:xs)
| x == 0 = case f xs of
[] -> []
ys@(y:_) -> if y == 0 then ys else x : ys
| otherwise = x : f xs
此功能基本上删除了所有结尾的0's
,但最多保留一个前导0。
例如:
f [1,2,0,0] = [1,2]
f [1,2,0,1] = [1,2,0,1]
f [0,0,1,0,0,3] = [0,1,0,3]
我有foldr op z lst
,但不知道op
可以是什么。 z
应该是[]
。
我跟踪的示例:
foldr op [] [0,0,1,0,0,3]
-> 0 op (0 op (1 op (0 op (0 op (3 op []))))
|-- [3] ---|
|---[0,3] ------|
|-----[0,3]-----------|
|-----[1,0,3]---------------|
|-----[0,1,0,3]-------------------|
|-----[0,1,0,3]-------------------------|
答案 0 :(得分:2)
怎么样
f = fst . foldr (\ x (xs', y) -> if y && x == 0 then (xs', x==0) else (x:xs', x==0 )) ([], True)
在这种情况下,op
返回一个列表元组和Bool,Bool用于跟踪累积列表是否以0开头。最后,我们使用fst
丢弃Bool。我们必须使用([], True)
作为初始值,以处理尾随零的情况。