玉祥平台客服-15087858732

标题: C#函数式编程 [打印本页]

作者: Adam丶鱼    时间: 2020-6-7 18:28
标题: C#函数式编程
编程语言范式
常见的编程范式有命令式编程(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对于数学家来说,似乎只是个永不为真的表达式而已。
函数式编程十分容易并行,因为它在运行时不会修改任何状态,因此无论多少线程在运行时都可以观察到正确的结果。假如两个函数完全无关,那么它们是并行还是顺序地执行便没有什么区别。

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



作者: Adam丶鱼    时间: 2020-6-7 18:29

作者: fteair    时间: 2020-6-10 14:33





欢迎光临 玉祥平台客服-15087858732 (http://bbs.delit.cn/) Powered by Discuz! X3.2