我正在进行自我练习,并想知道是否有办法在列表中找到符合某个标准的左边第一个项目foldr?我希望在找到第一个项目时停止递归(我知道我可以结合使用take),但我很想知道是否可以使用它foldr?
firstFind (\x -> x > 1000) [] xs
Run Code Online (Sandbox Code Playgroud)
问题:找到f和b.
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为了清楚起见我写了类型签名,但你不必将它包含在你的代码中.如果你添加它,取消注释,你会遇到一个类型变量混乱:这a与ain findFirst因为不一样它是在本地推广的 - 因为你刚刚开始,忽略它并暂时删除它.)