Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell递归查找函数和数据。可折叠查找说明_Haskell_Find - Fatal编程技术网

Haskell递归查找函数和数据。可折叠查找说明

Haskell递归查找函数和数据。可折叠查找说明,haskell,find,Haskell,Find,如果没有家庭作业: first' :: (a -> Bool) -> [a] -> Maybe a -- Finds the first element of a list that satisfies a given condition. 在这句话之后我迷路了: 如果px,那么只有x,其他什么都没有 如何继续使其递归 我发现: -- | The 'find' function takes a predicate and a structure and returns --

如果没有家庭作业:

first' :: (a -> Bool) -> [a] -> Maybe a
-- Finds the first element of a list that satisfies a given condition.
在这句话之后我迷路了: 如果px,那么只有x,其他什么都没有 如何继续使其递归

我发现:

-- | 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


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

如果你正在学习Haskell,我建议你暂时忘掉Foldable和First,因为它们涉及的主题比实现First所需的更高级

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

-- 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呢?您可以使用if-then-else来实现这一点。
如果您正在学习Haskell,我建议您暂时忘记Foldable和First,因为它们涉及的主题比实现First所需的更高级

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

-- 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呢?您可以使用if-then-else来实现这一点。 但我不理解这一部分:getFirst。foldMap\x->First

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

newtype First a = First { getFirst :: Maybe a }  
    deriving (Eq, Ord, Read, Show)  

直观地说,这意味着:

-- 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
空元素是零中的第一个

附加两个元素是第一个元素中的第一个元素,如果有,则为第一个元素,否则为零

因此,顾名思义,它是一个幺半群,记录了它遇到的第一个幺半群

如果你看一下,它,毫不奇怪,执行一个组合折叠映射版本的所有东西在折叠。直观地说,如果折叠式包含一些Just,那么foldMap的结果就是第一个这样的Just;否则,它首先什么都不是

现在,你想把这个值先提取到一个函数中。这就是getFirst所做的

整个行由getFirst和foldMap组成

但我不理解这一部分:getFirst。foldMap\x->First

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

newtype First a = First { getFirst :: Maybe a }  
    deriving (Eq, Ord, Read, Show)  

直观地说,这意味着:

-- 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
空元素是零中的第一个

附加两个元素是第一个元素中的第一个元素,如果有,则为第一个元素,否则为零

因此,顾名思义,它是一个幺半群,记录了它遇到的第一个幺半群

如果你看一下,它,毫不奇怪,执行一个组合折叠映射版本的所有东西在折叠。直观地说,如果折叠式包含一些Just,那么foldMap的结果就是第一个这样的Just;否则,它首先什么都不是

现在,你想把这个值先提取到一个函数中。这就是getFirst所做的


整个行由getFirst和foldMap组成。

感谢您的清晰解释,但我仍然有我的原始问题:在正常的递归函数中,只要一个条件不满足,我就进行迭代结果=无,或者如果条件满足,结果=仅x,我们停止。这里我需要三个条件:没有,只有x,继续迭代。谢谢你的清晰解释,但我仍然有我原来的问题:是Maybe语句让我困惑。在正常的递归函数中,只要一个条件不满足,我就迭代。结果=Nothing,或者如果条件满足,结果=Just x,我们就停止。这里我需要三个条件:没有,只有x和继续迭代。我怎样才能克服这个困难?@Atir如果列表为空,您知道没有满足p的值,因此您不能返回任何内容。否则,你可以检查px:它成立,你可以只返回x,否则,你将与列表的其余部分一起递归。谢谢你的清晰解释,但我仍然有我的原始问题:在正常的递归函数中,只要一个条件不满足,我就进行迭代结果=无,或者如果条件满足,结果=仅x我们停止。这里我需要三个条件:没有,只有x,继续迭代。谢谢你的清晰解释,但我仍然有我原来的问题:是Maybe语句让我困惑。在正常的递归函数中,只要一个条件不满足,我就迭代。结果=Nothing,或者如果条件满足,结果=Just x,我们就停止。这里我需要三个条件:没有,只有x和继续迭代。我怎样才能克服这个困难?@Atir如果列表为空,您知道没有满足p的值,因此您不能返回任何内容。否则,您可以检查px:如果保持不变,您可以只返回x,否则,您将与列表的其余部分一起递归。