C#中的Nutshell函数式编程
目录介绍函数编程定义函数属性纯度头等函数闭包的概念成为函数式函数式实用程序纯度重要性头等的重要性函数编程和面向对象编程集成函数编程总结下载源码 - 7.9 KB介绍如今函数性编程正在流行。我们应该问自己有两个问题为什么这种变化发生在程序员和语言创造者身上以及如何证明这一点有很多函数语言CC Java。LispJavaScriptPythonSmalltalkRubyOCamlFScalaGroovyDErlangClojureGoSwift等。我们还可以注意到有很多关于函数式编程的书籍还有另外两个重要问题如何定义一种函数语言什么是函数式编程函数编程定义函数式编程是基于函数它们的组合以及也基于函数分解的编程。组合/分解的这种影响是编程范例的标志一种建模和构建解决方案的方式。作为例子引用的所有语言都具有函数概念。函数式编程包括使用具有特定属性的函数。函数属性函数有两种可能的属性纯度函数的结果取决于它们的参数而没有任何其他外部影响。头等函数具有值的状态。函数编程包括利用这些属性中的一个或两个。函数式语言是一种让函数式编程更具优势的语言。纯度如果函数是纯函数则意味着它将生成仅依赖于函数的参数而没有任何其他外部影响的结果。函数纯度拒绝副作用和状态。倡导数据结构的不变性。例如下面是一个纯函数int f(int i){ return i 4; } f(1); // - 5 f(1); // - 5以下是一个不纯的函数int j 4; int g(int i){ j i j; return j; } g(1); // - 5 g(1); // - 6作为其他示例Log是纯函数。Random是一个不纯的函数。头等函数要成为头等函数意味着函数具有与诸如整数或字符之类的值相同的状态函数可以被命名、影响和类型化。可以根据需要定义和创建函数。函数可以作为另一个函数的参数传递。可以从另一个函数返回一个函数。函数可以存储在数据结构中。下面是一些例子1.被命名、影响和类型化的能力Funcdouble, double f Math.Sin;2.按需定义和创建的能力Funcint, int f x x 1;3.作为参数传递给函数的能力g(f, 1, 2);其中g定义如下double g(Funcdouble, double f, double x, double d){ return f(x) d; }4.作为函数结果的能力Funcdouble, double f g(10);其中g定义如下Funcdouble, double g(double x){ return y x y; }5.能够存储在数据结构中例如列表var l new ListFuncdouble, double { Math.Sin, Math.Cos, Math.Tan };此外C允许将lambda表达式表示为称为表达式树的数据结构ExpressionFuncint, int expression x x 1; var d expression.Compile(); d.Invoke(2);因此它们可以被存储和传输。闭包的概念闭包和头等是两个独立的属性。但是要成为纯粹和/或头等必须将函数转换为闭包。例如当我们将以下函数关联到以下环境时以下函数将转换为其他上下文中的纯函数int i 0, j 1; int f(int k){ return k i j; }函数式语言的标志是自动将函数的定义转换为闭包。成为函数式以前的定义表明纯度是编写函数的一门学科。为了提高函数状态不必全部实现头等的五个特征。函数语言不需要专门使用。纯度和头等可以在最初没有的语言中受到青睐。函数式实用程序在开发和项目方面纯度和头等函数的实际后果是什么纯度重要性纯度引发以下主要特征与函数的应用程序上下文无关。每当子表达式被赋值时每个子表达式都可以被赋值。这意味着函数组合的稳定性。以下是纯度的重要性函数概念简化了手续。更完整和更具代表性的函数行为类型。自然并行化。提高了可读性和可维护性。简单的测试。记住值缓存。控制评估。然而纯度使一些事情变得复杂数据结构的管理。显式内存管理。输入/输出的定义和错误处理只能使用纯函数进行编码。Haskell是一种强加于此的语言。C允许注释函数以明确指示它们是纯的[Pure] bool f(int i){ return i 4 0; } Contract.Requires(f(0));在C的官方文档中“锲约中调用的所有方法都必须是纯粹的;换句话说它们不能更新预先存在的状态。”头等的重要性头等的函数是可以被命名、影响和类型化的。可以按需定义和创建。可以作为参数传递给函数。可以是函数的结果。可以存储在数据结构中。如果函数可以作为参数传递给函数那么它将意味着泛化/函数抽象的可能性。函数中代码的每个部分都可以用抽象函数调用代替。一个简单的代码float M(int y){ int x1 [ ... ]; int x2 [ ... ]; [ ... ] [ ... some code ... ]; // some code using x1, x2 and y [ ... ] }函数抽象public delegate int Fun(int x, int y, int z); float MFun(Fun f, int x2, int y){ int x1 [ ... ]; [ ... ] f(x1, x2, y); [ ... ] } int z1 MFun(F1, 1, 2); int z2 MFun(F2, 1, 2);函数抽象的优点是没有局部重复并且存在关注点分离。函数抽象的简单有效应用是对数据的通用高阶迭代操作。例如内部迭代器MapsIEnumerableT2 MapT1, T2(this IEnumerableT1 data, FuncT1, T2 f){ foreach(var x in data) yield return f(x); } someList.Map(i i * i);作为头等的另一个结果我们对泛型函数类型进行了定义。C为arity提供函数和程序通用委托预定义类型最多16个delegate TResult FuncTResult (); delegate TResult FuncT, TResult(T a1); delegate TResult FuncT1, T2, TResult(T1 a1, T2 a2); delegate void ActionT(T a1); [ ... ]通过推理类型可以减轻头等的函数。C提供了var关键字但它对于函数类型来说太弱了。要按需定义和创建通过匿名函数完成也称为lambdasdelegate(string s) { return s some string; };匿名委托看起来更像lambda表达式(s { return s some string; }); s s some string;一个主要的例子是对数据结构的迭代处理的推广它有三种类型的函数mapreduce / folds和filters。例如内部迭代器MapsIEnumerableT2 MapT1, T2(this IEnumerableT1 data, FuncT1, T2 f){ foreach (var x in data) yield return f(x); } someList.Map(i i * i);大多数函数式语言在其库中提供映射/简化/过滤器在C中是Select/Aggregate/Where。映射/简化/过滤器函数集也用于表示治疗的组成例如LINQvar q programmers .Where(p p.Age 20) .OrderByDescending(p p.Age) .GroupBy(p p.Language) .Select(g new{ Language g.Key, Size g.Count(), Names g });作为函数的结果允许适应函数。部分申请currying。使用头等函数每个n元函数都可以转换为n个一元函数的组合即成为一个curried函数Funcint, int, int lam1 (x, y) x y; Funcint, Funcint, int lam2 x (y x y); Funcint, int lam3 lam2(3); // partial applicationCurryingpublic static FuncT1, FuncT2, TRes CurryT1, T2, TRes(this FuncT1, T2, TRes f){ return (x (y f(x, y))); } Funcint, int lam4 lam1.Curry()(3); // partial application要存储在数据结构中允许动态模块化管理函数集结构化列表表格树图等。将参数作为函数集而不是简单函数传递。此外其中一个缺点是数据驱动编程。一些函数式编程技术使用纯度和头等MapreduceC中的SelectAggregate广义迭代处理纯函数便于并行化。通过函数仿真控制评估封装在没有参数的函数中的纯表达式这些函数的按需逐个调用评估。函数编程和面向对象编程为什么函数式编程通常集成到面向对象的编程中主要的面向对象编程语言基于类作为模块CC Java。面向对象编程中开发的强大思想之一维护、扩展和适应操作可以通过继承和类组合这避免了对现有代码的任何修改。函数式编程是这个问题的解决方案。例如战略设计模式。策略模式是让算法独立于使用它的客户端而变化策略只是在方法级别抽象代码的情况不需要面向对象的封装和新的类层次结构。例如在.NET Framework中public delegate int ComparisonT(T x, T y); public void Sort(ComparisonT comparison); public delegate bool PredicateT(T obj); public ListT FindAll(PredicateT match);其他设计模式如命令观察者访问者和虚拟代理可以使头等的函数受益集成函数编程包含头等函数的语言应该促进函数编程并促进它。总结函数编程有利于开发纯度和头等产生一定程度的稳定性、确定性、可测试性、分区、使用流动性、组合性、概括性、可扩展性等。函数式编程适用于模块化对象。函数式编程是可溶的纯度和头等函数可以用任何语言来考虑包含和促进。函数/方法级别的代码抽象。方便的通用迭代器/循环实现。操作组合序列/查询理解。函数部分应用。对象/类定义数量的限制。在函数/方法级别命名抽象。架构简化。增加灵活性。

相关新闻

C++ - const

C++ - const

以下内容参考自《程序员面试宝典》 (一)指针常量 & 常量指针 关于const修饰指针的情况,可以分为以下4种情况: int b 1; const int* a &b; // case 1 int const *a &b; // case 2 int* const a &a…

2026/10/27 6:50:55 阅读更多 →
物联网设备硬件安全方案与SE050开发实践

物联网设备硬件安全方案与SE050开发实践

1. 为什么物联网设备需要硬件级安全方案在2023年某智能家居设备大规模入侵事件中,攻击者通过破解弱加密的固件签名机制,远程控制了超过20万台设备。这个案例暴露出传统软件安全方案的致命缺陷——当MCU本身被攻破时,所有存储在Flash中的密钥和…

2026/10/26 6:50:48 阅读更多 →
vue简易项目流程思路简述

vue简易项目流程思路简述

\(^o^)/~1、首先得创建一个vue项目 cnpm install vue/cli -g 安装全局vue-cli脚手架,用于帮助搭建所需的模板框架 vue create myapp 或 vue ui 或者直接找一个打包好的项目解压即可 2、创建基本结构(抽离页面组件和底部组件) 共同组件例如Footer抽离至co…

2026/10/24 10:13:29 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/26 12:00:21 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/27 4:06:49 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/26 4:52:12 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/26 12:00:21 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/27 6:20:47 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/27 4:06:50 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/26 12:00:19 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/25 13:21:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/26 8:34:37 阅读更多 →