zoukankan      html  css  js  c++  java
  • Functional language(函数式编程语言)初步了解


    对于函数式语言并不太了解,查询了百度、博客、知乎等做了以下总结。

    What

      函数式语言(functional language)一类程序设计语言,是一种非冯·诺伊曼式的程序设计语言。函数式语言主要成分是原始函数、定义函数和函数型。

    这种语言具有较强的组织数据结构的能力,可以把某一数据结构(如数组)作为单一值处理;可以把函数作为参数,其结果也可为函数,这种定义的函数

    称为高阶函数,程序就是函数,程序作用在结构型数据上,产生结构型结果,从根本上改变了冯·诺伊曼式语言的“逐词”工作方式。

      函数式程序语言的目的是尽可能的模拟数学函数。

      函数式语言的核心特征:

       (1)以“函数”为首,如同命令式语言中的“变量”,函数可以赋值给其他变量,可以作为其他函数的参数,

          或者作为其他函数的返回值。

       (2)不修改变量的值

       (3)只有表达式,没有语句。此处的语句指的是没有返回值得某些操作。

       (4)引用透明(Referential transparency),函数的运行不依赖与外部变量或“状态”,简单的说就是,

          同一个输入(参数),总是会产生同一个输出(返回值),这与数学函数的特征很一致。

          命令式语言因为全局变量等的存在,就无法做到这一点。

       (5)对比命令式语言,递归形式的循环

    Include

    函数式编程语言有以下几种:

      Haskell是一种于1980年代末期所发布的函数式编程语言,Haskell函数式编程语言是在Miranda的基础上得到了,它对Miranda进行了标准化,

    所以这种语言集合了其他相关函数式编程开发的原理,它无需花费太多的赘述就能完成一些数据结构,比如链表和矩阵,是当前最广泛地被用于研究的一种函数式编程语言。

      另一种函数式编程语言是Clean,它和Haskell有很多一样的地方。目前这门语言是用C写成的,由尼兹梅根大学负责维护。

      还有一种函数式编程语言是Meta Language, MetaLanguage是由爱丁堡大学与上个世纪七十年代末所开发的,它被归类为非纯函数式编程语言,它之所以有这样的归

    类是因为它允许了副作用和指令式编程的使用。

      目前,函数式编程语言还有F#,这是一款针对.NET平台的开放研究的语言。

      还有OCaml, Lisp

    函数式编程语言的特点包括以下几种:

      1、并行。在函数式编程中,程序员无需对程序修改,程序就可以并发运行。程序运行期间,不会产生死锁现象。

      2、单元测试。在函数式编程中,由于程序中的每一个符号都是final后的,所以这样的函数不会产生副作用。

      3、没有额外作用。在函数式程序语言中,所有的功能的结果就是一个返回值,不存在其他的行为,包括对外部变量的修改。

      4、不修改状态。在函数式编程中,程序语言在使用中是会不修改变量的,它的一个特性可以使得函数式编程语言区别于其他的程序语言。在其他类型的语言中,变量是用来保存状态的。

      5、引用透明。在函数式编程中,引用透明指的是运行函数的时候,函数的没一个步骤都不会不牵连到函数的外部变量或状态,而是只依赖于函数输入的参数,相同的参数输入总会得到相同的函数返回值。

      6、代码部署热。对函数式的程序,所有的状态即传递给函数的参数都被保存在了堆栈上,这使的热部署轻而易举。

    Why popular

      首先,函数式编程语言的代码十分简单,加快了开发的速度。并且由于在使用函数式编程语言时,程序员会大量使用到函数,从而减少了重复的代码,因而程序比较短。

      其次,函数式编程语言更加接近我们使用的自然语言,程序员在学习和使用它的时候更加快捷容易。函数式编程语言的自由度很高,十分接近自然语言写出的代码。函

    数式编程语言的代码管理更加方便。函数式编程不会对外部产生依赖,也不会修改外界的状态。程序员只需把指定的参数给函数,相同的参数其返回的结果必定是相同的。

    另外,函数式编程语言还支持并发编程,这就使得程序员在进行函数式编程时完全不用考虑死锁的问题,因为它根本就不修改变量,所以就不存在锁线程的问题。

      最后,函数式编程语言的代码支持代码热升级。

      

  • 相关阅读:
    接口方法上的注解无法被@Aspect声明的切面拦截的原因分析
    SpringBoot整合Netty
    简单的RPC框架
    基于redis的分布式锁的分析与实践
    8种方案解决重复提交问题
    领券中心项目,如何用 Redis 做实时订阅推送的?
    IM(即时通讯)服务端(二)
    IM(即时通讯)服务端(一)
    0xC00000FD: Stack overflow (parameters: 0x00000000, 0x003E2000).错误
    int (*a)[10]和int *a[10]的区别
  • 原文地址:https://www.cnblogs.com/xiaohuomiao/p/10436784.html
Copyright © 2011-2022 走看看