函数式编程之-初窥F#
大量讲解函数式编程语言的书籍最终都会用Fuctor,Monad,Monoids,范畴论等各种词汇吓退命令式语言玩家,所以我试图避开这些问题,揭开这些复杂词汇带来的具有实战意义的成果。另外我会尽量使用C#语言来描述函数式编程思想,因为C#某些语法和特性来自于函数式语言的启发,但C#终究并不是正统的函数式语言,随着对话题的深入,我们不可避免要使用F#来描述某些特性。所以本文会对F#的基础语法做一些简单了解,本文并不是一个纯粹的F#教程,只会提及必要的F#语法,最终循序渐进穿插在整个文章中。
函数是一等公民
在函数式语言里,函数被设计为一等公民,也就是说函数跟int, bool等类型并没有什么区别,例如在命令式语言的函数定义中,参数可以是int值,那么在函数式语言里,参数也可以是一个函数。这种特性在C#其实也是工作的:
public void Convert(Func<int,bool> selector){ }
这种设计在函数式语言里会有更进一步的体现:
在F#中声明一个简单类型用let:
let x = 6
声明一个函数:
let f x = x + 1
或者:
let f = fun x -> x + 1
无论是申明类型还是函数,都用let,这并不是一个巧合,因为在语言设计者眼里,函数和其他类型都是一样的。
另外需要注意,不要看到上面的代码认为F#是一门动态语言,F#毫无疑问是一门静态语言,通过type inference来工作。它要比C#中的var强大的多,只有在少数情况下需要加类型声明,考虑下面的例子:
let stringLength x = x.Length
上面的代码并不能正常工作,仅仅通过x.Length无法推断出x的类型,此时需要显示标注类型:
let stringLength (x:string) = x.Length
当然你还可以向其它语言那样,标注函数的返回值类型,虽然此时此刻这一步并不是必须的:
let stringLength (x:string) :int = x.Length
理解unit类型
我们在上一篇对数学中的函数做了描述,其中提到对于任意的输入总会有唯一的输出值与之对应,考虑下面的代码:
let printNumber x = printf "%i" x
这段代码不论你输入什么样的x,它只是打印了一个数字(副作用),他的返回值是什么?不像C#中的void,F#会返回一个真实的类型unit,注意unit并不是null或者void,他是一个类型,如int一样。
理解tuple类型
F#里有一些常用的数据结构,例如tuple,Record types,Discriminated Union,Option,List,不要担心,目前你只需要知道tuple就可以了。
除了诸如int, string等类型,如何快速的组合几个类型在一起呢?声明一个类?答案是:No, 比如("hello", 1)就是有一个string和int组合在一起的tuple类型,他的类型为string * int。例如下面的函数:
let sum (x, y) = x + y
它的方法签名是:sum : x:int * y:int -> int 即函数名为sum,接受int * int类型的一个tuple,返回int类型。
如果要接受两个int类型的参数应该这样定义的:
let sum x y = x + y
好了,F#的基本介绍已经完毕,下一篇将介绍Currying,他是函数式编程语言中常用的模式之一,想要继续了解的朋友继续关注下一篇。
函数式编程之-初窥F#的更多相关文章
- 理解iOS与函数式编程
有时候,一个关键字就是一扇通往新世界的大门.两年前,身边开始有人讨论函数式编程,拿关键字Functional Programming一搜,全是新鲜的概念和知识,顺藤摸瓜,看到的技术文章和框架也越来越多 ...
- 李洪强iOS开发之函数式 编程初窥
函数式 编程初窥 最近在学习Erlang和Python.Erlang是完全的函数式编程语言,Python语言是面向对象的语言,但是它的语法引入了大量的函数式编程思想.越研究越觉得函数式的编程思路可 ...
- js算法初窥06(算法模式03-函数式编程)
在解释什么是函数式编程之前,我们先要说下什么是命令式编程,它们都属于编程范式的一种.命令式编程其实就是一块一块的代码,其中包括了我们要执行的逻辑或者判断或者一些运算.也就是按部就班的一步一步完成我们所 ...
- 【JS】394- 简明 JavaScript 函数式编程-入门篇
转载自公众号"程序员成长指北" 写在开头 本文较长,总共分为三大部分:(对于函数式编程以及其优点有一定理解的童鞋,可以直接从 第二部分 开始阅读) 第一部分:首先会通过实际代码介绍 ...
- iOS视频直播初窥:高仿<喵播APP>
视频直播初窥 视频直播,可以分为 采集,前处理,编码,传输, 服务器处理,解码,渲染 采集: iOS系统因为软硬件种类不多, 硬件适配性比较好, 所以比较简单. 而Android端市面上机型众多, 要 ...
- 从 Racket 入门函数式编程
一直想学学LISP,今天总算开了个头.如今学习LISP不是为了立就可以以用于实际项目的应用,而是为了学习一下函数式的思维方式,可以更加深入的了解计算的本质,可以更好的用C++, Java, Pytho ...
- s14 第4天 关于python3.0编码 函数式编程 装饰器 列表生成式 生成器 内置方法
python3 编码默认为unicode,unicode和utf-8都是默认支持中文的. 如果要python3的编码改为utf-8,则或者在一开始就声明全局使用utf-8 #_*_coding:utf ...
- Haskell 函数式编程
Haskell是纯函数式编程,它强调不函数不改变外部世界状态,即,一个函数的输出只由函数接收的输入决定.那如何与外面沟通呢,比如读取一个文件内容并输出这个文件内容(字符串),显然这种函数非纯函数,因为 ...
- redux源码解析-函数式编程
提到redux,会想到函数式编程.什么是函数式编程?是一种很奇妙的函数式的编程方法.你会感觉函数式编程这么简单,但是用起来却很方便很神奇. 在<functional javascript> ...
随机推荐
- 做seo应该如何选择网站程序?
网站程序:(具体网站案例,可在官网看到)绝大多数情况下,我们将做的网站有以下几种1.个人博客,推荐的程序Wordpress(php的程序,比较强大),Zblog(asp的程序,比较简单)2.门户网站( ...
- Codeforces 1091D New Year and the Permutation Concatenation 找规律,数学 B
Codeforces 1091D New Year and the Permutation Concatenation https://codeforces.com/contest/1091/prob ...
- [转]etcd 启用 https
1, 生成 TLS 秘钥对 2,拷贝密钥对到所有节点 3,配置 etcd 使用证书 4,测试 etcd 是否正常 5,配置 kube-apiserver 使用 CA 连接 etcd 6,测试 kube ...
- elasticsearch 修改磁盘比例限制
命令为:下面也可以单独进行限制,官网说可以设置具体数值,但是无没成功,有成功的大神可以在下面告诉我一下哈 PUT _cluster/settings{ "persistent": ...
- Unity自动生成AnimatorController
上一篇写了如何自动切割动画,这一篇写如何自动生成AnimatorController. 之前网上查了很多资料,看的一直很蒙,看不懂是怎么回事的,这里我先给大家明确几个概念: 画的不好,大家将就着看,写 ...
- linux系统中使用socket直接发送ARP数据
这个重点是如这样创建socket: sock_send = socket ( PF_PACKET , SOCK_PACKET , htons ( ETH_P_ARP) ) ; 其后所有收发的数据都是 ...
- Android逆向破解表单登录程序
Android逆向破解表单登录程序 Android开发 ADT: android studio(as) 程序界面如下,登录成功时弹出通知登录成功,登录失败时弹出通知登录失败. 布局代码 <?xm ...
- 如何更改github工程的语言属性
当创建github项目的时候,github本身会根据提交文件的数量来自动推断工程的开发语言,有时这种推断结果会与实际情况不太相符.比如上传一个java的web工程,如果在工程里存在大量的html.ja ...
- Struts网站基于Filter的XSS漏洞修复
下面的代码只支持struts2框架中的xss漏洞 第一步,创建过滤器XssFilter : package com.ulic.ulcif.filter; import java.io.IOExcept ...
- 《JAVASCRIPT 高级程序设计》读书笔记六 面向对象的程序设计
一 对象属性 a.对象定义: 无序属性的集合,其属性可以包含基本值.对象或者函数: b.两种创建方式: 1.构造函数: var person = new Object(); person.name ...