函数式编程学习之路(八)
针对函数式编程的两大粘性演练:
高阶函数:
public class MapClass : IWrite { public static IEnumerable<TResult> Map<T, TResult>(IEnumerable<T> list, Func<T, TResult> func) { foreach(T t in list) { yield return func(t); } } public static void Map<T>(IEnumerable<T> list, Action<T> func) { foreach (T t in list) { func(t); } } public void Write() { int[] list = { 1, 2, 3 }; var result = Map<int, int>(list, x => x * 2); Map<int>(result, x => Console.WriteLine(x)); Console.ReadKey(); } public static void Run() { new MapClass().Write(); } }
理解这个东东后,果然感觉很多计算变得轻松了。最直接的做法就是把一堆数据,和某种操作粘合起来。一下子,你就觉得函数功能被“扩展”了。给传统僵化的函数,插了了年轻的想象翅膀。
它还有个很直觉的东西就是,计算“反向化”了。
比如:Map<int>(result, x => Console.WriteLine(x));
传统思维,我要输出东西是要给WriteLine传点东西进去,它是有限制的。
现在好了。是我要输出点东西,然后我把“输出”传进去,逆天了。然后你的东西就被输出了。这种反向扩展,在银河系漫游系列里有个屋子。这个屋子的门向里开,不是进去的,是出来的。要出到屋子的外面,你必须从“门”里进去,要不然,你是一直在屋子里的。
由此可见反向扩展之威力!
惰性求值:
待续……
【推荐】国内首个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的设计模式综述