问题描述
当列表中的至少一个元素满足条件True
时,我正在尝试引入一个给出(>5)
的函数
*Main> any (>5) [1..]
True
这是我的有效代码:
any1 f [] = True
any1 f (x:xs) = f x || any f xs
但是我想用foldr
来实现它,我该怎么做?
感谢您的帮助。
解决方法
列表上的foldr
模式基本上替换为:
foldr f z [x1,x2,…,xn]
具有:
f x1 (f x2 (… (f xn z) …))
因此,它将“ cons”构造函数(:)
替换为f
,并将空列表[]
替换为z
。
因此,您应该查看any1 f
的值如何映射到空列表,并定义一个函数g
,该函数将元素xi
和第二个元素作为第一个参数foldr g [xi+1,xi+2,xn]
的结果:
any1 :: Foldable f => (a -> Bool) -> f a -> Bool
any1 f = foldr g …
where g … = …
您需要填写…
的地方。