我需要在列表中显示后继元素更大的元素数量。例如,在列表[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 /> 我缺少什么?如何修正代码以实现目标?
答案 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
的数量。