F#学习之路(1)什么是函数式编程

对于什么是函数式编程,这个是人云亦云。本文并不打算对此进行定义,而是希望与园子里的朋友们共同探讨这个话题,抛砖只为引玉。

1、维基百科给出的定义是:

函数式编程是种编程范式,它将电脑运算视为函数的计算。函数编程语言最重要的基础是λ 演算(lambda calculus)。

而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。

2、函数应该是高阶函数,可柯里化

从维基百科定义可以看出,大家对函数式编程语言中,函数是一等公民(first class)这个概念是没有异议的。

函数应该享受值的同等待遇,可以作为一个函数的参数,可以作为一个函数的返回值。

函数应该是高阶函数。函数应该可柯里化(currying)。

#light
let p f=
fun (x)-> f(x)
let c t=
t+10
let r=p c
let f=p (fun x-> "Hello," + x )
printfn "r=%d" (r 10 );
printfn "f=%s" (f "Lvxuwen")
open System
Console.ReadKey(true)

在F#中定义一个函数使用let 绑定表达式, 语法规则如下:

let函数名 参数1 参数2…参数n=函数体

F#参数之间用空格分隔,而不同于C#中用逗号分隔,参数也不用括号。

上面的F#代码第一行用#light指令,指出使用精简的语法规则,而不使用OCaml语法,OCaml语法使用begin end ;; ; in 等关键字来区分语句及作用域,使用#light指令后,虽然让我们可以使用简洁的语法,但这也意味着F#将利用缩进来区分语句及作用域。你可以在vss中 选择工具-选项-文本编辑器->F#-Tabs,设置Tab为插入空格,这可以让你方便的使用tab键缩进。另外,在vss中,你把上例"Hello," 改成中文"欢迎",如果在控制台中乱码,你可以选择 文件->高级保存选项->更改字符编码为中文简体GB2312或unicode编码。

3、纯函数式语言没有变量和副作用

这一点是函数式语言被认为编写并发程序最理想语言的重要原因。没有了变量和副作用,就不再有竞争资源的问题存在,就不再需要锁。

在F#中,let定义的标识符是表达式,并且一旦定义就不可更改。定义变量要使用专门的关键字mutable

let mutable var=20
var<-30;
let constant=30
constant=40
printfn "var=%d" var
printfn "constant=%d" constant

变量var使用mutable关键字定义,并使用<-操作符赋值。而=操作符而被用做相等比较运算符,而constant使用<-,就会编译报错

函数式编程中,函数用来定义规则,算法,如果一个函数使用同一个值传入,总是返回相等的结果,我们就说这个函数是没有副作用, 幂等的。 这样的函数最符合重用的原则,在高阶函数计算过程中可得到预知的结果。

时间: 2025-01-21 14:16:06

F#学习之路(1)什么是函数式编程的相关文章

王亟亟的Python学习之路(八)-函数式编程,map(),reduce(),filter()

转载请注明出处:王亟亟的大牛之路 首先在这里祝愿大家,新年快乐,工作顺利,BUG少少!!! 本来说是在春节假期内继续维持着写文章的进度,但是还是偷懒了几天(打了4天SC2哈哈哈) 今天上的是关于Python的文章,毕竟在亲戚家拜年,懒得插各类手机调试什么的,况且确实好久没有弄Python了,就写了,废话不多,开始正题!! 函数式编程 函数是什么? 把复杂的操作化为简单的函数分解成简单的操作,这种操作就是面向过程,也就是C这类的实现的大体概念. 函数式是什么? 函数没有变量,任意一个函数,只要输入

F#学习之路(2) 深刻理解函数(上)

函数在函数式编程语言中是一等公民,是函数式语言中最重要的基本组成元素,也是其名称的由来. F# 中的函数之如C#中的类,是组织程序结构的最基本单元.是命令式编程语言中函数或OO编程语言中方法的超集.超集,有多强大?我将在下面几个方面细细道来. F#是一种多范式的编程语言.支持命令式.函数式.面向对象的编程范式,还有目前火热的面向语言编程(DSL).本文不会介绍其他的编程范式,只介绍函数式编程范式. 在面向对象编程的世界里,视命令式或过程式是一种丑陋的编程方式,至少被大多数程序员视为不能有效发挥O

F#学习之路(6) 列表类型

列表在函数式编程中占据着重要的位置.在Lisp语言中,一切皆是列表,就连函数也是列表,列表在Lisp语言中发挥到了极致.F#语言列表语法来源于Ocaml,与Haskell语言也基本一致.本文只会讲解一些常用的使用方法,要很好的掌握列表,各位朋友可以google一下相关的内容.网络上对列表讨论比较深刻的大多以Haskell语言为例(Lisp语言列表很强大,但与大多数函数式语言列表的区别太大,不好借鉴). 一.如何定义列表 在F#中定义一个列表,有几个方法. 1.使用字量值 let l=[1;2;3

F#入门:使用.NET Framework中的函数式编程技术

本文讨论: 安装 F# F# 语言基础 .NET 互操作性 异步 F# 本文使用了以下技术: .NET Framework, F# 目录 为什么要使用 F#? 安装 F# 您好,F# Let 表达式 关键字 For 管道 F# 也能够处理对象 异步 F# 与 F# 合作 作 为 Microsoft .NET Framework 家族的新成员,F# 提供类型安全.性能以及类似脚本语言的工作能力,所有这些都是 .NET 环境的一部分.此函数式语言由 Microsoft 研究院的 Don Syme 发

F#学习之路(5) 元组类型

元组类型,表示一组有序数据类型的集合.F#通过支持元组类型,方便了我们定义临时数据结构,而不需要为了临时的数据专门定义一个数据类型. 一.元组的定义: let tuple_2=(1,2) let tuple_3=("F#",1.9,"F# Function Language") 在F#中元组使用小括号,元素之间逗号分隔来定义.元组元素可以是任何类型. 上面代码中,tuple_2的类型是int*int,而tuple_3的类型为string*float*string.元

F#学习之路(2) 深刻理解函数(下)

3.函数作用域 在F#中组织程序结构的方法有以下几种,使用类型 (type)来支持自定义数据类型,使用名称空间(namespace)来确保类型唯一,模块(module)则用来封装某一数据类型及其操作,而函数则封装了行为或业务逻辑.本文只简单介绍模块(module),其他内容将在下一主题中讨论. 函数是函数式语言中最基本的组成,是应用程序中具体业务逻辑的实现者,弄清其作用域非常必要. 在F#语言中,每一个源代码文件(本文仅指以.fs为扩展名的文件),其默认有一个以文件名首字母大写的模块名(modu

F#学习之路(7) 集合类型

上一篇博客,介绍了列表类型,本篇将介绍数组类型Array.字典类型(Map),以及可变数组(ResizeArray).Set类型. 一.数组类型 (Array) 数组类型,在语义上表示一组相同类型的集合.这个跟列表(List)相似,两者的区别在于列表类型数据元素不可变,而数组类型可以.虽然数组类型随机访问,在查询访问上性能优先列表,但列表在变更集合(增加.删除集合元素)上有更好的性能.这个跟大多数语言是相似的. 定义数组类型的语法,跟列表也很相似,区别在于数组多了两个"|"符合. le

F#学习之路(4) 基本类型

F#基本类型包括整型.浮点型.布尔型(bool).字符型(char).字符串型(string),还有元组类型(tuple).列表类型(list).数组类型(array),序列类型(seq).另外,还允许我们定义记录类型(record type).联合类型(union type).活动模式等.当然,F#作为一种多范式的编程语言,支持所有的OO编程语法,允许我们定义类.接口.委托.结构等,本篇文章只介绍基本类型,其它类型在后续的文章中一一介绍. 上面这张图,比较的详细的介绍了F#的基本类型.左边一列

F#探险之旅(五):透过F#理解函数式编程(上)

关于函数式编程(Functional programming,FP) 函数式编程(FP)是一种编程范式,它计算机的计算过程视为函数运算,避免状态和数据的修改.与命令式编程相比,它更强调函数的运用.λ运算构建了函数式编程的基础.重要的函数式编程语言包括Lisp.Scheme.Erlang.Haskell.ML.OCaml等,微软则在2005年引入了F#. 此外,包括C/C++/C#/Python/Javascript等很多语言也提供了对FP的部分支持.由此我们可以得出一个结论,随着现实问题复杂度的