什么是函数式编程

函数编程(FunctionalProgramming, FP)是最早的一种编程范式。第一种FP语言是IPL,产生于1955年,比Fortran的产生早一年;第二种FP语言是1958年出现的Lisp,比Cobol的产生早一年。Fortran和Cobol都是命令式编程语言,它们在科学和商业领域中的迅速崛起使得命令式编程在30多年的时间内占主导地位。随着1970年代面向对象范式的兴起和面向对象语言的不断成熟,使得面向对象编程成为今天最流行的编程范式。

尽管强大的FP语言(SML, OCaml和Clean等)和类FP语言(Erlang,Lisp和Haskell 是在现实世界中最成功应用的类FP语言)从1950年代就在不断的发展,但是直到最近,FP依然处于学术研究状态;而当企业意识到他们需要更复杂的计算方案的时候,面向对象编程得到广泛的接受和认可。今天,解决更复杂的问题像解决简单的问题一样的FP终于被大家意识到。

纯粹的FP编程将程序看作是接受参数并返回值的函数集合,使用递归代替循环迭代,这样不会有副作用。在函数式编程中的函数类似于数学函数,它们不改变程序的状态。例如,一旦将一个值赋给一个标识符,它永远不会改变,函数不改变它的参数值,返回的是一个新的值。在典型的底层实现中,一旦一个值被分配到一块内存空间,它就不会改变。函数拷贝一个值,然后更改副本,这样原始的值可以被其他函数自由地使用,当它不再被使用时,将被扔掉(这是垃圾回收的最初想法)。

由于纯函数式编程的数学基础是很优雅的,所以FP为很多计算问题提供了美观、简洁的解决方案。但是它的无状态和递归性使得它在处理很多通用的编程任务时逊于其他的编程范式。然而, F#的优势之一就是融合了多种编程范式,允许开发人员按照需要采用最好的范式。

为什么函数式编程很重要

要知道函数式编程的重要性,我们就不应该被它的劣势所蒙蔽,而应该知道它的优势在哪。例如在函数式编程语言中,你可以把函数当作值传递给另一个函数。乍一看好像这个优势并不明显,事实上这个功能很不一般哦。模糊数据与函数之间的区别意味着许多问题都将迎刃而解。与命令式编程和面向对象编程相比,函数式编程语言在代码上也会更简洁。

函数式编程的很多其他功能都是来源于数学,不仅仅是将函数视为值这个功能,这些功能在命令式语言中是很少见的。因此,相比较于其他语言,数学运算或科学计算在函数式编程中将显得尤为简单。下面是函数式编程语言中很明显的一个特点:对待带有参数的函数,我们可以一次只传一个参数给它,如果还有参数没有传入,那么这个函数及传入的参数将作为一个整体,继续等待剩余参数的传入。而且,函数可以返回多个值,如此一来其他函数就可以随心所欲的使用这些返回值了。

F#是什么?

总的来说:F#是一种高生产率的函数式的、面向对象.NET编程语言,使用户能够编写简单的代码来解决复杂的问题。其简洁的语法和强大的类型推断,让用户更贴近他们的工作领域,并且它被整合到.NET和VisualStudio中,这样就可以更好使用强大的.NET 平台。

现在一些最流行的函数式语言(包括OCaml,Haskell,Lisp和Scheme)都是用传统的客户端运行实现的,这样会导致像缺乏互操作性的问题。而F#是一种.NET(一个公共运行时)通用的编程,它流畅的集成了三种主要的编程范式。所以用F#,你可以自由地选择最高效率的范式来解决问题。如果你是一个纯粹的人,你可以用纯函数式编程。但是你更可以很容易的在同一个程序中混合使用函数式、命令式和面向对象的编程范式,以及利用每种范式的优点。就像其他强类型语言一样,F#也是强类型的语言,并且还是类型推断性的,这样程序员就不必要花时间去显示地指定类型了(除了有类型冲突时)。更为强大的是,F#无缝地集成了.NET基础类型库,在F#中使用.NET的类库跟在C#或VB中一样简单(或许更简单)。F#是以OCaml为蓝本(一种成功的面向对象的函数式编程语言),并且很好地对.NET进行了整合和扩展。它完全的融入到了.NET,让用户做任何.NET可以做的事。F#编译器能编译所有对公共语言基础结构(CLI)的继承实现,它支持.NET泛型(无需更改任何代码),它还是支持内联中间语言(IL)代码。F#编译器不仅能执行任意的公共语言基础代码,而且能在任意有CLI的环境上编译。这意味着F#不限制于Windows平台,它可以在Linux,AppleMac OS X和OpenBSD上运行。

F# 入门(一):介绍相关推荐

  1. 【无标题】C#nbsp;语言入门基础介绍学习通http://www.bdgxy.com/

    文章来源: 学习通http://www.bdgxy.com/ 普学网http://www.boxinghulanban.cn/ 智学网http://www.jaxp.net/ 表格制作excel教程h ...

  2. 51单片机入门基础介绍

    51单片机入门基础介绍 文章目录 51单片机入门基础介绍 前言 常用元器件 发光二极管 数码管 LED数码管的显示方式 按键 定时计数器 串行口控制寄存器SCON 中断系统 中断源及中断请求 中断允许 ...

  3. java开发和基于asp.net开发有什么优越性?_java语言的入门开始介绍

    java编程语言是目前世界最流行的编程语言,它是在c++的基础上开发出来的语言,它取其精华去其糟粕让java语言具有功能强大和简单易用的特征. java具有:面对对象.分布式.健壮性.安全性.平台独立 ...

  4. FPGA入门基础介绍

    1.1 FPGA入门基础介绍 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA入门基础介绍: 5)结束语. 1.1.2 本节引言 "不积跬步,无以至千里 ...

  5. EasyX入门和介绍

    //EasyX入门和介绍 //画实心圆 #include <graphics.h> //引用EasyX图形库 #include <conio.h> int main() {in ...

  6. 第一章 51单片机开发入门知识介绍

    第一章 单片机开发入门知识介绍 1.1 51单片机介绍 51单片机是对所有兼容Intel 8031指令系统的单片机的统称. 该系列单片机的始祖是Intel的8004单片机,后来随着Flash rom技 ...

  7. Android/Linux 子系统Graphics图形栈入门普法介绍

        Android/Linux 子系统Graphics图形栈入门普法介绍 写在最前面   由于工作原因,最近在公司做了一个关于Android/Linux 子系统Graphics图形栈入门相关知识的 ...

  8. Docker新手入门详细介绍

    Docker新手入门详细介绍 Docker 起源于 dotCloud 公司的内部项目,于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护,2013 ...

  9. 新手入门:介绍JSP中request属性的用法

    新手入门:介绍JSP中request属性的用法 一.request.getParameter() 和request.getAttribute() 区别 (1)request.getParameter( ...

  10. iMobile for ReactNative入门使用介绍

    ##iMobile for ReactNative入门使用介绍 ####iMobile for ReactNative是SuperMap iMobile推出的一款基于React-Native框架的移动 ...

最新文章

  1. 系统清理工具(Wise Care 365)绿色版
  2. python生成wheel包注意事项
  3. 一次网站性能排查实录
  4. 同一类的不同对象,在调用相同的成员函数时,入口地址是相同的
  5. 先知模型 facebook_Facebook先知
  6. Strings_append_学习
  7. centos7图形化界面安装KVM虚拟机
  8. 修改 oracle 数据库 TNSLSNR.exe 占用 8080 端口
  9. 免杀工具BypassAv-web使用教程
  10. 最稳定的tracker服务器,BT Tracker服务器
  11. 官网下载历史版本的tomcat
  12. Expected property shorthand报错
  13. 大厂技术博客学习(2)​——5G时代下淘宝直播高清低延时技术jie秘
  14. c#配合c++调节屏幕亮度,非伽马以及RGB方案
  15. Python 模拟登录AUSU路由器获取在线用户列表
  16. java ip 白名单_Java代码中对IP进行白名单验证
  17. 白魔法师(牛客小白月赛25 图、并查集)
  18. 怎么给照片换背景颜色?分享几种非常简单的操作方法
  19. 带你上手 AI 大赛
  20. hdoj杭电问题分类

热门文章

  1. yum安装jdk详细步骤
  2. 计算机毕业设计 SSM网上跳蚤市场平台系统 校园跳蚤市场系统 网络跳蚤市场管理系统Java Vue MySQL数据库 远程调试 代码讲解
  3. php ajax access,转载:解决Ajax跨域 Access to XMLHttpRequest问题
  4. struts2.3+spring3.1.2+hibernate4.1.6 配置说明
  5. 乔岩航拍作品赏析:从格陵兰岛小镇到白马雪山
  6. 关于CPU相关漏洞的修复处理
  7. 【安防监控】雪亮工程的监控设备是如何预防雷电击与高压
  8. Excel中跨越合并与合并后居中的区别
  9. PayPal2019笔试题(Java版)
  10. Shift_JIS、CP932、MS932、Windows-31J