使用foldr获取符合条件的第一个项目

时间:2014-08-30 12:17:07

标签: haskell fold

我正在进行自我练习,并想知道是否有办法只使用foldr找到符合特定条件的列表中左起第一个项目?我希望在找到第一个项目时停止递归(我知道我可以使用take进行组合),但我很想知道是否可以使用foldr

firstFind (\x -> x > 1000) [] xs 

1 个答案:

答案 0 :(得分:8)

问题:找到fb

firstFind :: (a -> Bool) -> [a] -> Maybe a
firstFind p list = foldr f b list
   where f = ???
         b = ???

我们希望:

firstFind p [] = Nothing

但我们也有

firstFind p [] 
= def. firstFind
foldr f b []
= def. foldr
b

我们从中了解b必须是什么。

此外,请list = x:xs

firstFind p list
= def. firstFind
foldr f b (x:xs)
= def. foldr
f x (foldr f b xs)
= def. firstFind
f x (firstFind p xs)

现在,我们只需找到f,以便选择第一场比赛。

回想一下,f可能依赖于p。当f为真时,p x应该返回什么?相反的情况呢?

where -- f :: a -> Maybe a -> Maybe a
      f x y = ???

(注意:上面我为f编写了类型签名,但是你不必将它包含在你的代码中。如果添加它,取消注释,你将会遇到类型变量混淆: aa中的findFirst不同,因为它是在本地推广的 - 因为您刚刚开始,请忽略它,暂时将其删除。)