使用文件夹编写haskell函数

时间:2019-03-13 22:31:05

标签: haskell fold

我具有以下功能,应使用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]-------------------------|

1 个答案:

答案 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)作为初始值,以处理尾随零的情况。