fold 相关问题

在函数式编程中,折叠(也称为减少,累积或变形)是一种高阶函数,它递归地将变换应用于数据结构,将其“折叠”为汇总值

使用参数包和模板函数以差异为未命名的结构

我写了一个C ++ 20的概念myrequirement

回答 1 投票 0

vim vimscript:autoCMD将foldcolumn设置为foldlevel

i目标是将折叠式折叠式自动化为最深的折叠式。 在.vimrc中,我尝试了: AutoCMD Filetype HTML:SET FOLDMETHOD =语法 AutoCMD Filetype HTML:让&foldcolumn =&foldlevel 但是显示错误: E ...

回答 1 投票 0


返回矩形范围内的单元列表

作为OCAML的初学者,我正在尝试编写一个函数,该函数需要两个INT参数(A和B),并且应返回一个包含所有元组(i,j)的列表,其中我在0和a之间, j在0 ...

回答 3 投票 0

使用ocaml

given: 键入'a树=空| “ a *”一棵树 *'的节点 使用: 让rec tree_fold f e t =与 |空 - > e |节点(x,l,r) - > f x(tree_fold f e l)(tree_fold f e r);; 到

回答 0 投票 0

我可以用右折叠的依赖左折吗?

我们有 数据nat = z | S nat 类型VEC :: NAT->类型 - >类型 数据vec n a where nil :: vec z a (:: :: :::: vec n a-> vec(s n)a Infixr 4 :::: 衍生实例可折叠(vec n ...

回答 1 投票 0

使用foldr在haskell中实现插入

如何在haskell中使用foldr实现插入。 我试过: 插入'' :: Ord a => a -> [a] -> [a] 插入'' e xs =foldr (\x -> \y -> if x 如何在haskell中使用foldr实现插入。 我试过: insert'' :: Ord a => a -> [a] -> [a] insert'' e xs = foldr (\x -> \y -> if x<y then x:y else y:x) [e] xs 没有骰子。 我必须在列表中插入元素 e,以便它位于大于或等于它的第一个元素之前。 示例: insert'' 2.5 [1,2,3] => [1.0,2.0,2.5,3.0] insert'' 2.5 [3,2,1] => [2.5,3.0,2.0,1.0] insert'' 2 [1,2,1] => [1,2,2,1] 在上一个示例中,第一个 2 被插入一个。 编辑: 谢谢@Lee。 我现在有这个: insert'' :: Ord a => a -> [a] -> [a] insert'' e xs = insert2 e (reverse xs) insert2 e = reverse . snd . foldr (\i (done, l) -> if (done == False) && (vj e i) then (True, e:i:l) else (done, i:l)) (False, []) where vj e i = e<=i 但是这不起作用: insert'' 2 [1,3,2,3,3] => [1,3,2,2,3,3] insert'' 2 [1,3,3,4] => [1,3,2,3,4] insert'' 2 [4,3,2,1] => [4,2,3,2,1] 解决方案: insert'' :: Ord a => a -> [a] -> [a] insert'' x xs = foldr pom poc xs False where pom y f je | je || x > y = y : f je | otherwise = x : y : f True poc True = [] poc _ = [x] 谢谢@Pedro Rodrigues(只需将 x>=y 更改为 x>y。) (如何将此标记为已回答?) 你需要 paramorphism 为此: para :: (a -> [a] -> r -> r) -> r -> [a] -> r foldr :: (a -> r -> r) -> r -> [a] -> r para c n (x : xs) = c x xs (para c n xs) foldr c n (x : xs) = c x (foldr c n xs) para _ n [] = n foldr _ n [] = n 有了它, insert v xs = para (\x xs r -> if v <= x then (v:x:xs) else (x:r)) [v] xs 我们可以用 foldr 来模仿 init . tails 的同态,如下所示:需要根据元素升序的中断将列表划分为列表(Haskell)。 因此解决方案是 import Data.List (tails) insert v xs = foldr g [v] (init $ tails xs) where g xs@(x:_) r | v <= x = v : xs | otherwise = x : r 对同态进行编码的另一种方法是通过一系列函数,如 Pedro Rodrigues 的答案中所示,安排 从左到右信息流,同时传递输入列表本身的第二个副本:一个参数(复制 tails 的效果): insert v xs = foldr g (\ _ -> [v]) xs xs where g x r xs | v > x = x : r (tail xs) -- xs =@= (x:_) | otherwise = v : xs -- visual aid to how this works, for a list [a,b,c,d]: -- g a (g b (g c (g d (\ _ -> [v])))) [a,b,c,d] 与他的答案中的版本不同,这不会复制插入点之后的列表结构的其余部分(这是可能的,因为同态性“鱼与熊掌兼得”)。 这是我的看法: insert :: Ord a => a -> [a] -> [a] insert x xs = foldr aux initial xs False where aux y f done | done || x > y = y : f done | otherwise = x : y : f True initial True = [] initial _ = [x] 但是恕我直言,使用 foldr 并不是解决这个问题的最佳选择,对我来说以下解决方案更容易理解: insert :: Int -> [Int] -> [Int] insert x [] = [x] insert x z@(y : ys) | x <= y = x : z | otherwise = y : insert x ys 我想折叠在这里不太方便。它总是处理列表中的all元素,但是您需要在找到第一个出现的元素后停止。 当然这是可能的,但你可能不想使用这个: insert' l a = snd $ foldl (\(done, l') b -> if done then (True, l'++[b]) else if a<b then (False, l'++[b]) else (True, l'++[a,b])) (False, []) l 这是另一个使用 foldr 的解决方案。与这里的其他人相比,它简单易懂。 insert :: Ord a => a -> [a] -> [a] insert a = foldr swap [a] where swap y x_xs@(x:xs) | y > x = x:y:xs | otherwise = y:x_xs 但是,它有一个严重的限制:与使用正常递归解决方案的标准Data.List.insert不同,并且与 Pedro 和 Will Ness 的答案不同,这个版本在给定无限列表时会崩溃。 ghci> take 10 $ insert 4 [1,3..19] -- This works fine. [1,3,4,5,7,9,11,13,15,17] ghci> take 10 $ insert 4 [1,3..] -- This crashes. *** Exception: stack overflow ghci> import qualified Data.List as L (insert) ghci> take 10 $ L.insert 4 [1,3..] [1,3,4,5,7,9,11,13,15,17]

回答 4 投票 0

从“级联ifs”折叠表达式中检索值

假设我想使用以下语法创建自己的基于 lambda 的开关: auto s = make_switch(std::pair{0, []{ return 0; }}, std::pair{1, []{ 返回 50; }},...

回答 3 投票 0

F# FoldBack 转换为尾递归函数

出于学习目的,我模拟了 List.foldBack。模拟版本是头递归的。 有没有一种优雅的方法将其转换为尾递归版本? 让 li : int 列表 = [1;2;3] 让记录

回答 1 投票 0

Rust 中的欧拉项目#2

我正在学习 Rust,所以我正在做 Project Euler 问题,因为恕我直言,它们是很好的练习。 但我已经陷入了第二个问题。这个想法是找到所有偶数的总和......

回答 2 投票 0

用递归公式替换证明

以下问题和部分解决方案来自 Richard Bird 的 Thinking Functionly with Haskell (pp 132-133, 139) 给定 折叠 f e (x:xs) = 折叠 f (f e x) xs 折叠 f e [] = e 证明折叠(@)...

回答 1 投票 0

一种基于邻接对构建图邻接列表的方法,类似于 MIT 方案中的“fold”

最近自学MIT 6.5151课程时,先看了CS 61AS Unit 0作为准备。然后我按照 ps0 的要求阅读了 SICP 1 到 2.1(以及相关的讲义)(还阅读了 2.2.1 作为 CS 61A...

回答 1 投票 0

如何重新启用标尺中的折叠箭头

我使用vscode。 可折叠代码块过去在标尺中具有折叠/展开箭头,但现在我们有了粘性滚动条。 有没有办法重新启用标尺中的折叠箭头?

回答 1 投票 0

在VS Code中,如何将一段代码完全展开?

我想在 Visual Studio Code 中完全展开选定的代码。有“展开”命令,但这似乎只展开所选代码的单个级别。还有...

回答 1 投票 0

在 Visual Studio Code 中,如何完全展开一段代码?

我想在 Visual Studio Code 中完全展开选定的代码。有“展开”命令,但这似乎只展开所选代码的单个级别。还有“全部展开”,...

回答 1 投票 0

在Ocaml中使用fold_left反转列表内的元组

让 lst 成为一个包含元组的列表,我想反转每个元组(元组的顺序需要相同)。例如: [(a,b);(c,d)] -> [(b,a);(d,c)] 我知道可以用地图来完成: 列表...

回答 3 投票 0

使用fold_left从列表创建元组列表

如何从一个列表创建元组列表,如下所示: [1; 2; 4; 6] -> [(1, 2); (4, 6)] 我想使用函数 List.fold_left 来做到这一点,因为我目前正在尝试学习它,但不知道 h...

回答 3 投票 0

使用折叠命令后从数据创建变量

我的主要目标是设置从不同长度的字符串中获取的变量。每个变量必须包含字符串中的 4 位数字(即 var_1 = 数字 1-4,var_2 = 数字 5-8 等...

回答 1 投票 0

在 Python 中将函数应用于树的所有元素

有一个树状数据结构,其节点包含标量值(整数)、列表和字典、np.array。 我需要编写一个应用聚合函数的函数(在 Python 中)...

回答 1 投票 0

如何使用 Python 归约或列表理解将函数列表按顺序应用于字符串?

问题陈述 我想将函数列表 fs = [ f, g, h ] 按顺序应用于字符串 text=' abCdEf ' 像 f( g( h( 文本) ) ) 之类的东西。 这可以通过

回答 4 投票 0

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.