map/fold运算符(用c ++开头)

Leo*_*sky 6 c++ functional-programming stl

我正在编写可以在范围上进行地图/折叠操作的.我需要与运营商合作.我对函数式编程不是很熟悉,我暂时选择*了地图和||折叠.所以cos(x)在间隔中找到(强力算法)最大值 8 < x < 9:

double maximum = ro::range(8, 9, 0.01) * std::cos  || std::max;
Run Code Online (Sandbox Code Playgroud)

在上面,ro::range可以用任何STL容器替换.

如果地图/折叠运算符有任何约定,我不想有所不同.我的问题是:是否有数学符号或者是否有任何语言使用运算符进行map/fold?

**编辑**

对于那些问过的人,下面是RO目前可以做什么的小型演示. scc是一个小实用程序,可以评估C++片段.

// Can print ranges, container, tuples, etc directly (vint is vector<int>) :
scc 'vint V{1,2,3};  V'
{1,2,3}

// Classic pipe. Alogorithms are from std::
scc 'vint{3,1,2,3} | sort | unique | reverse'
{3, 2, 1}

// Assign 42 to [2..5)
scc 'vint V=range(0,9);   range(V/2, V/5) = 42;  V'
{0, 1, 42, 42, 42, 5, 6, 7, 8, 9}


// concatenate vector of strings ('add' is shotcut for std::plus<T>()):
scc 'vstr V{"aaa", "bb", "cccc"};  V || add'
aaabbcccc

// Total length of strings in vector of strings
scc 'vstr V{"aaa", "bb", "cccc"};  V * size ||  (_1+_2)'
9

// Assign to c-string, then append `"XYZ"` and then remove `"bc"` substring :
scc 'char s[99];  range(s) = "abc";  (range(s) << "XYZ") - "bc"'
aXYZ


// Remove non alpha-num characters and convert to upper case
scc '(range("abc-123, xyz/") | isalnum) * toupper'
ABC123XYZ


// Hide phone number:
scc "str S=\"John Q Public  (650)1234567\";  S|isdigit='X';  S"
John Q Public  (XXX)XXXXXXX
Run Code Online (Sandbox Code Playgroud)

Jer*_*fin 10

这真的是一个评论,而不是一个真正的答案,但它太长,不适合评论.

至少如果我对术语的记忆正确,map基本上是std::transform,而fold就是std::accumulate.假设这是正确的,我认为尝试编写自己的文章充其量是不明智的.

如果要使用地图/折叠样式语义,可以执行以下操作:

std::transform(std::begin(sto), std::end(sto), ::cos);
double maximum = *std::max_element(std::begin(sto), std::end(sto));
Run Code Online (Sandbox Code Playgroud)

虽然std::accumulate更像是一个通用折叠,但std::max_element基本上是一个fold(..., max);如果您更喜欢单一操作,您可以执行以下操作:

double maximum = *(std::max_element(std::begin(sto), std::end(sto),
    [](double a, double b) { return cos(a) < cos(b); });
Run Code Online (Sandbox Code Playgroud)

我敦促您重新考虑为此目的重载运算符.我上面给出的任何一个例子都应该对几乎任何合理的C++程序员都清楚.你给出的例子对大多数人来说都是完全不透明的.

在更一般的层面上,我会在超载运营商时要求极其谨慎.正确使用操作符重载是伟大的-能够重载运算符的东西像任意精度的整数,矩阵,复数等,使用这些类型的渲染代码比没有重载运算代码更易于阅读和理解.

不幸的是,当你以意想不到的方式使用运算符时,恰恰相反 - 这些用途肯定是非常出乎意料的 - 事实上,这些都是"非常令人惊讶"的范围.如果这些运算符在特定领域得到充分理解,可能会有问题(但至少有一点理由),但与C++中的其他用法相反.然而,在这种情况下,你似乎正在发明一个"整个布料"的符号 - 我不知道任何人使用任何运算符C++支持重载意味着折叠或映射(也没有任何视觉上类似或类似的任何其他办法).简而言之,以这种方式使用重载是一个糟糕且不合理的想法.


Isr*_*man 5

在我所知的语言中,没有标准的折叠方式.Scala使用运算符/::\方法名称,Lisp reduce,Haskell foldl.

map另一方面,更常见的是找到map我所知道的所有语言.