fold 相关问题

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

在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

错误:无法在初始化时将 'std::Optional<int>' 转换为 'const int'

#包括 #包括 #包括 #包括 使用命名空间 std; int main() { 常量向量 v = {1, 2, 3}; 常量整数 n =

回答 1 投票 0

从折叠内提前返回

我一直在尝试更多地了解 Rust 的函数式语言特性,所以我尝试采用这个函数: fn 最小长度(s:字符串)-> i32 { 如果 s.len() <= 1 { return s.len()...

回答 1 投票 0

foldM 与 monad 状态不进行类型检查

有关 FoldM 的现有问题(例如此处和此处)并未解决 State monad。 该文档没有指定示例,我什至无法编译一个简单的示例。 导入 Control.Monad.State.Lazy 导入

回答 1 投票 0

Haskell Foldr1 lambda 函数添加元组值

我一直在挠头试图弄清楚这一点。如何使用foldr1(或任何其他折叠)来获取列表中元组的总和。 例子: 列表 = [(1,2), (3,4)] 总和 = 1...

回答 2 投票 0

C++17 可变参数模板折叠

我不明白为什么这不起作用。了解模板和可变表达式折叠的人能否解释正在发生的事情并给出可行的解决方案? #包括 我不明白为什么这不起作用。了解模板和可变表达式折叠的人可以解释正在发生的事情并给出可行的解决方案吗? #include <iostream> #include <string> template <typename... Args> void print(Args... args) { std::string sep = " "; std::string end = "\n"; (std::cout << ... << sep << args) << end; } int main() { print(1, 2, 3); } 它应该打印出每个参数,参数之间有一个空格,末尾有一个换行符。如果您删除 sep <<,但打印时每个参数之间没有空格,它会起作用。 二进制折叠表达式的语法必须是以下之一: (pack op ... op init) (init op ... op pack) 你拥有的是(std::cout << ... << sep << args),它不适合任何一种形式。您需要像 (cout << ... << pack) 这样的东西,这就是删除 sep 有效的原因。 相反,您可以折叠逗号: ((std::cout << sep << args), ...); 或使用递归: template <class A, class... Args> void print(A arg, Args... args) { std::cout << arg; if constexpr (sizeof...(Args) > 0) { std::cout << sep; print(args...); } } 这可以工作,但它会打印一个尾随空格: template <typename... Args> void print(Args... args) { std::string sep = " "; std::string end = "\n"; ((std::cout << args << sep), ...) << end; } 现场魔杖盒示例 在这种情况下,正在执行逗号运算符的折叠,从而导致如下扩展: // (pseudocode) (std::cout << args<0> << sep), (std::cout << args<1> << sep), (std::cout << args<2> << sep), ..., (std::cout << args<N> << sep), 你真正想做的是: std::string sep = " "; std::string end = "\n"; (std::cout << ... << (sep << args)) << end; 因为您希望 (sep << args) 与 std::cout 一起向左折叠。这不起作用,因为 sep << args 不知道它正在流式传输到 std::cout 或根本不知道它正在流式传输; << 仅当左侧是流时才进行流式传输。 简而言之,问题在于sep << args不明白它正在流式传输。 你的另一个问题是 lambda 不够。 我们可以解决这个问题。 template<class F> struct ostreamer_t { F f; friend std::ostream& operator<<(std::ostream& os, ostreamer_t&& self ) { self.f(os); return os; } template<class T> friend auto operator<<(ostreamer_t self, T&& t) { auto f = [g = std::move(self.f), &t](auto&& os)mutable { std::move(g)(os); os << t; }; return ostreamer_t<decltype(f)>{std::move(f)}; } }; struct do_nothing_t { template<class...Args> void operator()(Args&&...)const {} }; const ostreamer_t<do_nothing_t> ostreamer{{}}; template <typename... Args> void print(Args... args) { std::string sep = " "; std::string end = "\n"; (std::cout << ... << (ostreamer << sep << args)) << end; } 活生生的例子。 (我还使用了 sep 的文字来确保我使用右值)。 ostreamer 捕获对它是 << 的事物的引用,然后将它们转储到 << 到 ostream。 整个过程对编译器来说应该是透明的,因此一个好的优化器应该消除涉及的所有内容。 正如其他人所回答的,您正在尝试使用错误的 fold-expression 格式。 您可以通过非常简单的方式使用 lambda 助手来达到您的目的: template <typename... Args> void print(Args&&... args) { std::string sep = " "; std::string end = "\n"; auto streamSep = [&sep](const auto& arg) -> decltype(arg) { std::cout << sep; return arg; }; (std::cout << ... << streamSep(args)) << end; } 这将遵循您编写的代码中预期的行为。但是,如果您想避免第一个参数之前的 sep,您可以使用以下内容: template <typename Arg, typename... Args> void print(Arg&& arg, Args&&... args) { std::string sep = " "; std::string end = "\n"; auto streamSep = [&sep](const auto& arg) -> decltype(arg) { std::cout << sep; return arg; }; std::cout << arg; (std::cout << ... << streamSep(args)) << end; } 另一种方法是下一个: #include <iostream> template<class U, class... T> void printSpaced(const U& u, const T&... args) { using std::cout; using std::endl; ((cout << u) << ... << (cout << ' ', args)) << endl; } 这样你就不会得到前导/尾随空格 用途: printSpaced(1, 2, "Hello", 4.5f); //Output 1 2 Hello 4.5 and no trailing space 你可以尝试这样的事情 template <typename... Args> void print(Args... args) { bool first = true; auto lambda = [&](auto param) { if( !first) std::cout << ','; first= false; return param; }; ((std::cout << lambda(args)), ...); } lambda 确保分隔符仅插入在两个项目之间。 另一方面,如果你不想使用 lambda,你可以重载模板: template<typename T> void print(T item) { std::cout << item; } template<typename T, typename... Args> void print(T item, Args... args) { print(item); std::cout << ','; print(args...); } 如果您不想要前导/尾随sep: template <typename First, typename... Rest> void print(First first, Rest... rest) { std::string sep = " "; std::string end = "\n"; std::cout << first; ((std::cout << sep << rest), ...); std::cout << end; } 您需要制作 std::cout << end; 一条单独的指令来处理具有一个参数的情况。

回答 7 投票 0

Markdown 中的可折叠标题到 html

我们的内部 git-lab wiki 使用 Markdown。 我做了几篇文章的摘要,并想将它们发布在我们的 wiki 中,这样,如果我单击标题,它应该展开并且文本显示...

回答 5 投票 0

如何在 Kotlin 序列上进行平行折叠?

作为帮助我学习 Kotlin 的练习,我正在编写一个应用程序,其中有大量对象,我想根据一组标准找到“最佳”对象,为此......

回答 1 投票 0

如何在 haskell 中计算带有柯里化参数的函数?

我正在编写一个定义如下的表达式求值器: eval :: LState -> Env -> Lexp -> (LState, Value) 其中LState是内存。 Env:Variable 和 Value.Lexp 的映射被定义为 su...

回答 1 投票 0

如何折叠列表中每次折叠的 x 个元素

所以,假设我们有一些如下列表:[1; 2; 3; 4; 5; 6],假设我想在每次调用函数时折叠 2 个元素。 所以,我会将该函数应用于 (1, 2)、(3, 4)、...

回答 4 投票 0

foldl 或foldr 对于插入列表元素更有效吗?

| l>1=foldr(b->a++"----- " ++ b) "" xs xs 是一个字符串列表,其目的是用五个破折号和一个换行符连接列表中的每个元素。 ...

回答 1 投票 0

FoldLeft/FoldRight:Scala 编译错误

尝试完成作业并遇到以下编译器错误: fp2.scala:144: 错误:foldRight 方法参数不足:(xs: List[A], e: B, f: (A, B) => B)B。 未指定

回答 1 投票 0

使用折叠构建字符串,并希望通过分配正确的容量来加快速度

我在 Rust 结构中有一个实现,它构建了一个非常大的字符串,最终将写入文件。我想知道是否可以通过确保字符串变量具有

回答 1 投票 0

Rust:使用折叠构建字符串,并希望通过分配正确的容量来加快速度

我在 Rust 结构中有一个实现,它构建了一个非常大的字符串,最终将写入文件。我想知道是否可以通过确保 String 变量具有

回答 1 投票 0

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

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

回答 3 投票 0

Ocaml 树上的奇怪函数

如果一个节点的值大于可以在通往根的路上找到的任何其他节点的值,则该节点被称为美丽节点。问题是计算给定树上的漂亮节点。 这里是

回答 2 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.