问题描述
我是 Haskell 的新手,我正在尝试弄清楚如何编写代码,在列表中的元素 >0 之前删除全零。
例如:
输入:[0,5,6,0]
输出:[5,0]
到目前为止,我已经写了这个:
zeroUntil :: [Int] -> [Int]
zeroUntil [] = []
zeroUntil (x:xs)
| x == 0 = drop x (xs)
| otherwise = zeroUntil xs
但不知何故 [5,0] 我得到了 [ ]。
谁能解释一下我做错了什么?
解决方法
您可以使用 dropWhile :: (a -> Bool) -> [a] -> [a]
并因此丢弃项目,只要这些项目为零:
zeroUntil :: [Int] -> [Int]
zeroUntil = dropWhile (0 ==)
如果您想删除零直到元素大于零,您可以使用递归。如果这些小于零,您的递归情况应该产生元素:
zeroUntil :: [Int] -> [Int]
zeroUntil [] = []
zeroUntil (0:xs) = zeroUntil xs
zeroUntil (x:xs)
| x > 0 = x : xs -- ← end of recursion,return the list
| otherwise = x : zeroUntil xs -- ← yield x and recurse
例如:
Prelude> zeroUntil [0,5,6,0]
[5,0]
Prelude> zeroUntil [0,-1,0]
[-1,0]
,
zeroUntil :: [Int] -> [Int]
zeroUntil [] = []
zeroUntil (x:xs)
| x == 0 = drop x (xs)
| otherwise = [x] ++ (zeroUntil xs)
必须将第一个元素(x
)添加到递归调用返回的列表中,否则返回一个空列表。