在过滤器中考虑列表的其余部分

时间:2019-12-18 10:54:39

标签: haskell filter

我需要在列表中显示后继元素更大的元素数量。例如,在列表[3,7,2,1,9]中,我的函数应返回2,因为7大于3且9大于1。
为此,我正在考虑使用过滤器功能:

greaterElems :: Ord a => [a] -> Int
greaterElems [] = 0
greaterElems [x] = 0
greaterElems (x:xs) = length (filter (< head xs) (x:xs))

但是,这不能按预期方式工作:Haskell似乎总是考虑列表的第二个元素,好像“ head xs”仅被计算一次,但这对我来说似乎不正常,因为Haskell是惰性的。 br /> 我缺少什么?如何修正代码以实现目标?

1 个答案:

答案 0 :(得分:6)

您可以使用zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]传递列表及其尾部的位置。确实:

sucGreater :: Ord a => [a] -> [Bool]
sucGreater x = zipWith (<) x (tail x)

或如@RobinZigmond所说,我们可以省略尾巴,并使用drop

sucGreater :: Ord a => [a] -> [Bool]
sucGreater x = zipWith (<) x (drop 1 x)

对于给定的样本列表,这给我们:

Prelude> sucGreater [3,7,2,1,9]
[True,False,False,True]

我将其作为练习来计算该列表中True的数量。