首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell递归查找函数与Data.Foldable查找解释

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

Stack Overflow用户
提问于 2017-05-27 08:46:15
回答 2查看 193关注 0票数 1

给予(无家庭作业):

代码语言:javascript
复制
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. 我发现了这个: --“find”函数接受一个谓词和一个结构并返回--结构的最左边元素与谓词匹配,或者--如果没有这样的元素,则“Nothing”。查找::可折叠t => (a -> Bool) -> t ->,可能是find p= getFirst。foldMap (\ x ->优先(如果p只是x其他任何东西))

但我不明白这一节:getFirst . foldMap (\ x -> First (

有人能解释一下这句话吗?

EN

回答 2

Stack Overflow用户

发布于 2017-05-27 09:25:11

如果您正在学习Haskell,我建议您暂时忘掉FoldableFirst,因为它们涉及比实现first'所需的更高级的主题。

作为提示,请尝试计算一个简单的递归定义,如下所示:

代码语言:javascript
复制
-- 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是尾列表xs中第一个令人满意的p,那么如何表示完整列表x:xs中的第一个令人满意的p?你可以用如果-然后-其他的。
票数 2
EN

Stack Overflow用户

发布于 2017-05-27 12:48:33

但我不明白这一节: getFirst。foldMap (\ x -> First )

首先,让我们看一下First,例如在李亚赫中。它是一个幺半群,定义如下:

代码语言:javascript
复制
newtype First a = First { getFirst :: Maybe a }  
    deriving (Eq, Ord, Read, Show)  

代码语言:javascript
复制
instance Monoid (First a) where  
    mempty = First Nothing  
    First (Just x) `mappend` _ = First (Just x)  
    First Nothing `mappend` x = x  

从直觉上看,这意味着:

  • “空”元素是First of Nothing
  • “追加”两个元素是它们的第一个FirstJust (如果有一个,则为First Nothing )。

因此,顾名思义,它是一个“记录”它遇到的第一个Just的单子。

如果你看一下foldMap,它就会对可折叠的所有东西进行折叠,这是不足为奇的。那么,直觉地说,如果折叠包含一些Just,那么foldMap的结果就是First这样的Just;否则,它就是First Nothing

现在,您希望将这个First的值提取到一个Maybe中。这就是getFirst所做的。

整个行由getFirstfoldMap组成。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44214805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档