first' :: (a -> Bool) -> [a] -> Maybe a
-- Finds the first element of a list that satisfies a given condition.
这句话后我迷路了:
if p x then Just x else Nothing)
如何继续递归?
我发现了这个:
-- | The 'find' function takes a predicate and a structure and returns
-- the leftmost element of the structure matching the predicate, or
-- 'Nothing' if there is no such element.
find :: Foldable t => (a -> Bool) -> t a -> Maybe a
find p = getFirst . foldMap (\ x -> First (if p x then Just x else Nothing))
但我不理解这一部分:getFirst . foldMap (\ x -> First (
有人可以解释这个陈述吗?
答案 0 :(得分:2)
如果您正在学习Haskell,我建议您暂时忘记Foldable
和First
,因为这些主题涉及实现first'
所需的更多高级主题。< / p>
作为提示,尝试制定一个简单的递归定义,如下所示:
-- Finds the first element of a list that satisfies a given condition.
first' :: (a -> Bool) -> [a] -> Maybe a
first' p [] = ...
first' p (x:xs) = ...
where
-- the first in the tail xs
rec = first' p xs
想一想:
p
的内容应该是什么?rec
是尾部列表p
中第一个令人满意的xs
,您如何在完整列表p
中表达第一个令人满意的x:xs
?你可以使用if-then-else。答案 1 :(得分:2)
但我不明白这一节:getFirst。 foldMap(\ x - &gt; First(
首先,让我们看一下First
,例如LYAH。它是 monoid ,定义如下:
newtype First a = First { getFirst :: Maybe a }
deriving (Eq, Ord, Read, Show)
和
instance Monoid (First a) where
mempty = First Nothing
First (Just x) `mappend` _ = First (Just x)
First Nothing `mappend` x = x
直观地说,这意味着以下内容:
“空”元素是First
的{{1}}
“附加”两个元素是Nothing
的{{1}},如果有的话,则为First
。
因此,顾名思义,它是一个“monoid”,它“记录”它遇到的第一个Just
。
如果你看一下foldMap
,毫不奇怪的是,它会折叠折叠的所有内容的映射版本。直观地说,如果可折叠包含一些First Nothing
,那么Just
的结果就是Just
这样的foldMap
;否则,它是First
。
现在,您要将此Just
中的值提取到First Nothing
。这就是First
的作用。
整行代表Maybe
与getFirst
。