函数式编程之-初窥F#

目录

函数是一等公民
理解unit类型
理解tuple类型

大量讲解函数式编程语言的书籍最终都会用Fuctor,Monad,Monoids,范畴论等各种词汇吓退命令式语言玩家,所以我试图避开这些问题,揭开这些复杂词汇带来的具有实战意义的成果。另外我会尽量使用C#语言来描述函数式编程思想,因为C#某些语法和特性来自于函数式语言的启发,但C#终究并不是正统的函数式语言,随着对话题的深入,我们不可避免要使用F#来描述某些特性。所以本文会对F#的基础语法做一些简单了解,本文并不是一个纯粹的F#教程,只会提及必要的F#语法,最终循序渐进穿插在整个文章中。

函数是一等公民

在函数式语言里,函数被设计为一等公民,也就是说函数跟int, bool等类型并没有什么区别,例如在命令式语言的函数定义中,参数可以是int值,那么在函数式语言里,参数也可以是一个函数。这种特性在C#其实也是工作的:

1
public void Convert(Func<int,bool> selector){ }

这种设计在函数式语言里会有更进一步的体现:
在F#中声明一个简单类型用let:

1
let x = 6

声明一个函数:

1
let f x = x + 1

或者:

1
let f = fun x -> x + 1

无论是申明类型还是函数,都用let,这并不是一个巧合,因为在语言设计者眼里,函数和其他类型都是一样的。

另外需要注意,不要看到上面的代码认为F#是一门动态语言,F#毫无疑问是一门静态语言,通过type inference来工作。它要比C#中的var强大的多,只有在少数情况下需要加类型声明,考虑下面的例子:

1
let stringLength x = x.Length   

上面的代码并不能正常工作,仅仅通过x.Length无法推断出x的类型,此时需要显示标注类型:

1
let stringLength (x:string) = x.Length    

当然你还可以向其它语言那样,标注函数的返回值类型,虽然此时此刻这一步并不是必须的:

1
let stringLength (x:string) :int = x.Length  

理解unit类型

我们在上一篇对数学中的函数做了描述,其中提到对于任意的输入总会有唯一的输出值与之对应,考虑下面的代码:

1
let printNumber x = printf "%i" x

这段代码不论你输入什么样的x,它只是打印了一个数字(副作用),他的返回值是什么?不像C#中的void,F#会返回一个真实的类型unit,注意unit并不是null或者void,他是一个类型,如int一样。

理解tuple类型

F#里有一些常用的数据结构,例如tupleRecord typesDiscriminated UnionOptionList,不要担心,目前你只需要知道tuple就可以了。
除了诸如int, string等类型,如何快速的组合几个类型在一起呢?声明一个类?答案是:No, 比如("hello", 1)就是有一个stringint组合在一起的tuple类型,他的类型为string * int。例如下面的函数:

1
let sum (x, y) = x + y

它的方法签名是:sum : x:int * y:int -> int 即函数名为sum,接受int * int类型的一个tuple,返回int类型。
如果要接受两个int类型的参数应该这样定义的:

1
let sum x y = x + y

好了,F#的基本介绍已经完毕,下一篇将介绍Currying,他是函数式编程语言中常用的模式之一,想要继续了解的朋友继续关注下一篇。

posted @   .NET西安社区  阅读(777)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示