使用foldr编写haskell函数

问题描述 投票:-3回答:1

我有以下功能,应该用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应该是[]

示例I跟踪:

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]-------------------------|
haskell fold
1个回答
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)作为初始值,以处理尾随的零情况。

© www.soinside.com 2019 - 2024. All rights reserved.