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/7/28 13:52:35 阅读更多 →
物联网设备硬件安全方案与SE050开发实践

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

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

2026/7/28 13:51:34 阅读更多 →
vue简易项目流程思路简述

vue简易项目流程思路简述

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

2026/7/28 13:51:34 阅读更多 →

最新新闻

Ryujinx终极指南:如何在PC上免费流畅运行任天堂Switch游戏 [特殊字符]

Ryujinx终极指南:如何在PC上免费流畅运行任天堂Switch游戏 [特殊字符]

Ryujinx终极指南:如何在PC上免费流畅运行任天堂Switch游戏 🎮 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx 你是否曾梦想在电脑上体验《塞尔达传说&#xff1…

2026/7/28 14:36:17 阅读更多 →
SMS凭据中枢架构与落地路线图:四阶段推进

SMS凭据中枢架构与落地路线图:四阶段推进

很多团队上凭据管理系统,一上来就想"全公司动态化",结果半年推不动、业务怨声载道。安当 SMS 的最佳实践是先收口、再动态、分阶段。本文从整体架构、设计原则讲到四阶段实施路线图,给你一张可落地的推进地图。 一、8 大核心设计原…

2026/7/28 14:36:17 阅读更多 →
网站改版时间线,旧站新站切换:精确到天排期救回暴跌排名

网站改版时间线,旧站新站切换:精确到天排期救回暴跌排名

域名结构、静态资源存放路径、服务端口配置。服务器日常承载访问量达到四十二万次时,硬件架构若未预留百分之三十五的冗余带宽,页面加载时长会从零点八秒飙升至三点五秒。搜索引擎爬虫每日抓取额度默认分配五万个页面,单次抓取超时超过两千毫…

2026/7/28 14:36:17 阅读更多 →
【JAVA毕业设计】计算机行业人才信息招聘运维管理系统 智能化 IT 岗位招聘与简历筛选系统(源码+文档+远程调试,全bao定制等)

【JAVA毕业设计】计算机行业人才信息招聘运维管理系统 智能化 IT 岗位招聘与简历筛选系统(源码+文档+远程调试,全bao定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/28 14:36:17 阅读更多 →
G-Helper终极指南:华硕笔记本轻量控制工具完全解决方案

G-Helper终极指南:华硕笔记本轻量控制工具完全解决方案

G-Helper终极指南:华硕笔记本轻量控制工具完全解决方案 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, E…

2026/7/28 14:36:17 阅读更多 →
计算机JAVA毕设实战-基于 SpringBoot 的综合性资讯推送与社区互动论坛系统 高校求知资讯阅览与交流讨论平台设计【完整源码+LW+部署说明+演示视频,全bao一条龙等】

计算机JAVA毕设实战-基于 SpringBoot 的综合性资讯推送与社区互动论坛系统 高校求知资讯阅览与交流讨论平台设计【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/28 14:35:16 阅读更多 →

日新闻

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:43 阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…

2026/7/28 0:00:43 阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:43 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/28 8:29:16 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/28 5:03:42 阅读更多 →

月新闻