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++支持重载意味着折叠或映射(也没有任何视觉上类似或类似的任何其他办法).简而言之,以这种方式使用重载是一个糟糕且不合理的想法.
在我所知的语言中,没有标准的折叠方式.Scala使用运算符/:和:\方法名称,Lisp reduce,Haskell foldl.
map另一方面,更常见的是找到map我所知道的所有语言.