Haskell递归查找函数和Data.Foldable查找解释

时间:2017-05-27 08:46:16

标签: haskell find

给出(没有作业):

first' :: (a -> Bool) -> [a] -> Maybe a
-- Finds the first element of a list that satisfies a given condition.
  1. 这句话后我迷路了: if p x then Just x else Nothing) 如何继续递归?

  2. 我发现了这个:

    -- | 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))
    
  3. 但我不理解这一部分:getFirst . foldMap (\ x -> First (

    有人可以解释这个陈述吗?

2 个答案:

答案 0 :(得分:2)

如果您正在学习Haskell,我建议您暂时忘记FoldableFirst,因为这些主题涉及实现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的作用。

整行代表MaybegetFirst