函数式编程学习之路(六)
找到点干货:
PROFESSIONAL FUNCTIONAL PROGRAMMING IN C#
看了下目录,正是我想要的,同时也发现,函数式编程果然博大精深,看目录,就有第一次看编程语言或是面向对象的感觉,里面的章节,基本上没有一个概念是熟悉的.
先从中文目录起把概念列出来:
惰性列表:迭代器
闭包
表达式树
局部套用
部分应用
惰性求值
缓存技术
递归调用
高阶函数
序列
组合函数
可选值
防止数据变化
单子
实际应用
MapReduce 模式
看了下目录,很多名词都无法直观表述,容易误解,我看还是看原版吧,顺便把E语学了.以防再重走以前学面向对象的老路(初学时搞不清楚对象是什么东西.后来知道是object,物体,东西,反而更容易理解了).
先来Currying:
Func < int, int, int > add = (x, y) => x + y;
作者也是用加减乘除举例子,这就很有趣了.原来问题是一致的.正等解决方案呢.
var add = (x, y) => x + y;不行,果然是C#还不支持,作者也在吐
Func < int, Func < int, int > > curriedAdd = x => y => x + y;
int i = curriedAdd(5)(6);
啊,原来Curring这么简单.和int result = addition(1, multiplication(2, subtraction(3, 1)))不一样了.
先不管Curring后到底能干什么,起码我们有了.但作者吐的东西就是,参数多了,定义复杂,所以绕了个圈子.
Automatic Currying
public static Func<T1, Func<T2, TResult>> Curry<T1, T2, TResult>(this Func<T1, T2, TResult> func)
{
return par1 => par2 => func(par1, par2);
}
然后就可以:
var v = Curry((int x, int y) => x + y);
var v1 = Curry<int, int, int>((x, y) => x + y);
int a = 1;
int j = v(a)(a);
var v3 = v1(a);
int k = v3(1);
a = 100;
int l = v3(1);
果然神奇的事情发生了, l值不受a变量改变的影响,函数式编程里的无副作用果然实现.
而传统两参数add(1, a)时,a变了,再调用add(1,a),那肯定是变化后的值了.真是神奇.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述