函数式编程之-初窥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> ...
随机推荐
- 20155312张竞予 Exp1 PC平台逆向破解(5)M
Exp1 PC平台逆向破解(5)M 目录 实验内容 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数. 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发get ...
- 【深度学习】安装TensorFlow-GPU
1.Windows版 准备 干净的系统,没有安装过Python,有的话就卸载了. 另外我的系统安装了VS2015 VS2017(这里我不知道是不是必备的). 现在TensorFlow和cuda以及cu ...
- 关于Idea里设置Terminal为Git/bin/bash.exe中文乱码的问题的终极解决方案
1.这里如果设置为Git/git-bash.exe确实不会乱码,但是每次点Idea里的Terminal都会弹出一个单独的terminal窗口而非在idea子窗口里出现: 2.因此需要设置为Git/bi ...
- jmeter+ant+jenkins接口自动化环境搭建
一.准备 1.安装jdk --->点击查看安装教程 2.安装jmeter ,官网下载jmeter解压,配置jmeter环境: JMETER_HOME (解压jdk路径) Path (;% ...
- KITTI数据集的使用——雷达与相机的数据融合
目录 目的 如何实现 kitti数据集简介 kitti数据集的raw_data 利用kitti提供的devkit以及相应数据集的calib文件 解读calib文件夹 解读devkit 目的 使用雷达点 ...
- TestNG(一)
1.环境搭建 2.框架结构 3.数据驱动 4.监听器 5.重试逻辑 6.异常测试 7.并发测试
- android初学
1布局 LinearLayout 线性布局 FrameLayout 框架布局 AbsoluteLayout 绝对布局 RelativeLayout 相对布局 TableLayout 表格布局 2标记语 ...
- C语言编程遇到的问题
1.内存泄漏问题 问题代码1 #include <stdio.h> #include <stdlib.h> int main( int argc, char *argv[] ) ...
- 剑指offer面试题23:从上到下打印二叉树(树的层序遍历)
题目:从上往下打印出二叉树的每个节点,同一层的结点按照从左往右的顺序打印. 解题思路:二叉树的层序遍历,在打印一个节点的时候,要把他的子节点保存起来打印第一层要把第二层的节点保存起来, 打印第二层要把 ...
- 一篇入门 — Gatling 性能测试手册
介绍 本篇博客,旨在记录学习的要点,所以格式随意, 方便本人日后自考和回忆,有兴趣的朋友可以评论讨论. 原文地址:https://www.cnblogs.com/clockq/p/10539974.h ...