度量快速开发平台-专业、快速的软件定制快开平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 部件 流程 SQL
查看: 1931|回复: 2
打印 上一主题 下一主题

[分享] C#函数式编程

[复制链接]

182

主题

2120

帖子

4842

积分

论坛元老

Rank: 8Rank: 8

积分
4842
跳转到指定楼层
楼主
发表于 2020-6-7 18:28:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
编程语言范式
常见的编程范式有命令式编程(Imperative programming函数式编程逻辑式编程;
许多现存的编程语言都可基于其计算模型加以分类,归入某些语言族,或者属于某种编程范式。按照不同的规则,可以有多种分类的方法,而且不同的学者对某些语言的具体归属也有不同的意见。
给出一种系谱:
说明式(Declarative )                   命令式( Imperative
  函数式  Lisp, ML, Haskell                冯诺依曼 C, Ada, Fortran
  数据流  ld, Val                         脚本式 Perl, Python, PHP
  逻辑式  Prolog                         面向对象 Smalltalk, C++, Java, C#
  基于模板 XSLT
有些编程范式并不能按以上的方法进行分类,比如:元编程,泛型编程。
一种语言并不是只从属于一种编程范式,有些语言本身就是为支持多范式设计的;
比如:Lisp就同时支持函数式编程、面向对象、元编程。
命令式编程是面向计算机硬件的抽象,有变量(对应着存储单元),赋值语句(获取,存储指令)表达式(内存引用和算术运算)和控制语句(跳转指令);

函数式编程
定义
In computer science, functional programming is a programming paradigm that treats computation as the evaluation of mathematical functions and avoids state and mutable data.
函数式编程是一种编程模型,他将计算机运算看做是数学中函数的计算,并且避免了状态以及变量的概念。<Wiki>
函数式编程是面向数学的抽象,将计算描述为一种表达式求值,一句话,函数式程序就是一个表达式
函数式编程最重要的基础是 λ 演算(lambda calculus)。而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。和指令式编程相比,函数式编程的函数的计算比指令的执行更重要。和过程化编程相比,函数式编程的函数的计算可随时调用。纯函数式编程不需要变量;

语言族
函数式编程中最古老的例子可能要数1958年被创造出来的LISP,当年的Lisp由于各种设计缺陷(内存损耗、闭包问题、生成程序执行效率等)没能发展好。较现代的例子包括Haskell、Clean、Erlang 和Miranda等。
现代编程语言,如C#、Python、Ruby、Scala等等,它们都受到了函数式编程语言的影响,比如C#中的lamada表达式、Linq。
基于JVM实现的Lisp方言如Scala, Clojure也是越来越受关注,这里所谓的Lisp方言,主要是因为语法上沿用了Lisp中的S表达式
基于.net平台的有F#,微软的首个函数式编程语言。<MSDN>

不同语言的抽象层次
    计算
             C#         ----->     对象
              Python      ----->    函数式
              C语言      ----->    函数 (面向过程)
              汇编语言
    计算机硬件  ----->    指令计算机

函数式复兴
Anders Hejlsberg,C#编程语言的首席架构师,2010年关于《编程语言的发展趋势及未来方向》演讲
从一个数组中找出所有的偶数
List<int> list = new List<int> { 1,2,3,4,5,6,7};
常规的命令式写法:
    List<int> ret = new List<int>();
    foreach (var item in list)
    { if (item % 2 == 0)
          ret.Add(item); }
声明式的写法: var ret = list.Where((x) => x % 2 == 0);

多核与并行
         使用命令式编程语言写程序时,我们经常会编写如x = x + 1这样的语句,此时我们大量依赖的是可变状态,或者说是“变量”,它们的值可以随程序运行而改变。可变状态非常强大,但随之而来的便是被称为“副作用”的问题,例如一个无需参数的void方法,它会根据调用次数或是在哪个线程上进行调用对程序产生影响,它会改变程序内部的状态,从而影响之后的运行效果。而在函数式编程中则不会出现这个情况,因为所有的状态都是不可变的。事实上对函数式编程的讨论更像是数学、公式,而不是程序语句,如x = x + 1对于数学家来说,似乎只是个永不为真的表达式而已。
函数式编程十分容易并行,因为它在运行时不会修改任何状态,因此无论多少线程在运行时都可以观察到正确的结果。假如两个函数完全无关,那么它们是并行还是顺序地执行便没有什么区别。

函数式编程特性                             与技术
函数是一等公民                        闭包
     高阶函数                                  惰性求值
     递归                                         缓存技术
    不可变状态                               尾调用消除
    柯里化                                      内存回收


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

182

主题

2120

帖子

4842

积分

论坛元老

Rank: 8Rank: 8

积分
4842
沙发
 楼主| 发表于 2020-6-7 18:29:12 | 只看该作者
回复

使用道具 举报

235

主题

2547

帖子

5835

积分

论坛元老

Rank: 8Rank: 8

积分
5835
板凳
发表于 2020-6-10 14:33:26 | 只看该作者
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|重庆度量科技  本站关键词:快速开发平台

GMT+8, 2024-12-23 02:12 , Processed in 0.123563 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表