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

Roh*_*rma 1 haskell fold

我正在进行自我练习,并想知道是否有办法在列表中找到符合某个标准的左边第一个项目foldr?我希望在找到第一个项目时停止递归(我知道我可以结合使用take),但我很想知道是否可以使用它foldr

firstFind (\x -> x > 1000) [] xs 
Run Code Online (Sandbox Code Playgroud)

chi*_*chi 8

问题:找到fb.

firstFind :: (a -> Bool) -> [a] -> Maybe a
firstFind p list = foldr f b list
   where f = ???
         b = ???
Run Code Online (Sandbox Code Playgroud)

我们想要:

firstFind p [] = Nothing
Run Code Online (Sandbox Code Playgroud)

但我们也有

firstFind p [] 
= def. firstFind
foldr f b []
= def. foldr
b
Run Code Online (Sandbox Code Playgroud)

我们从中看到了什么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)
Run Code Online (Sandbox Code Playgroud)

现在,我们只需要找到f这样选择第一场比赛.

回想一下,f可以依赖p.什么时候应该f返回p x?相反的情况是什么?

where -- f :: a -> Maybe a -> Maybe a
      f x y = ???
Run Code Online (Sandbox Code Playgroud)

(注意:上面我f为了清楚起见我写了类型签名,但你不必将它包含在你的代码中.如果你添加它,取消注释,你会遇到一个类型变量混乱:这aain findFirst因为不一样它是在本地推广的 - 因为你刚刚开始,忽略它并暂时删除它.)