函数式编程原理

一、ML标准类型

  • 基础类型(basic types):unit,int,real,bool,string

其中的unit类似于C语言中的void

  • 表(list):int list,(int ->int)list

  • 元组(tuples):int *int,int * int * real

  • 函数(functions):int->int,real->int * int

所有对象都要有类型,不一定显示说明,但必须能够静态推导(在编译时该类型能被编译器根据上下文推算出来)

1.ML基础类型

  • 单元unit:只包含一个元素,用空的括号表示,()

  • 整型int: 负号用~表示

  • 浮点型real

  • 布尔型bool:true,false

  • 字符串型string:双引号间的字符序列

2.表lists

  • 包含相同类型元素的优先序列
  • 表中元素用逗号分隔,这个那个表用[ ]括起来
  • 元素可以重复出现,其顺序有意义
  • 表的类型取决于表中元素类型(可以为任意类型,但需具有相同的类型)
  • 表可以嵌套
  • 表的基本函数

:: 追加元素

@ 连接表

null 空表测试

hd 返回表头元素

tl 返回非空表的表尾

length 返回表长

3.元组tuples

  • 包含任意类型数据元素的定长序列
  • 类型表达式:每个元素的类型用*间隔并排列在一起
  • 圆括号中用逗号分隔数据元素,允许嵌套

4.记录record

  • 类似C语言中的结构类型,可以包含不同类型的元素
  • 每个元素都有一个名字
  • 记录的值和类型的写法都用{ }括起来

5.函数function

  • 以一定的规则将定义域上的值映射到值域上去
  • 类型由它的定义域类型和值域类型共同描述
  • ->表示定义域到值域的映射

二、ML标准函数

  • 标准布尔函数:not,andalso,orelse

  • 标准算数运算函数:~,+,-,*,div,/

    运算符重载(operator):把同一运算符作用在不同类型上

    重载运算符的两边必须为同一类型

    整数到实数的转换:real

    实数到整数的转换:floor(下取整),ceil(上取整),round(四舍五入),trunc(忽略小数)

  • 标准字符串函数:

    把两个字符串合并成一个:^

    返回字符串的长度:size

1.值Values

  • 每个类型都有一个值的集合
  • 一个类型的表达式求值结果为该类型的一个值(或出错)
  • 严格类型检查

2.声明Declarations

  • 赋予某个对象一个名字,包括值、类型、签名、结构和函子

  • 函数的声明:

    fun <函数名> (<形式参数>) : <结果类型> = <函数体>

  • 值的声明:

    val pi=3.1415

  • 采用静态绑定方式—重新声明不会破环系统、库或程序

  • 任意一个类型的表达式都可以进行求值操作

  • 任意一个类型表达式求值的结果为该类型的一个值

  • ML提供重新声明功能

  • 声明将产生名字和值的绑定(binding)

  • 绑定具有静态作用域

2.1声明的使用

check : int * int -> bool

2.2声明的作用域

函数定义的两种方法

  • fun circ(r:real):real = 2.0*pi*r;

  • fun cirl(r:real):real=

    let

    ​ val pi2:real=2.0*pi

    in

    ​ pi2*r

    end

let D in E end 是局部声明

3.ML中的“=”

  • “=”用于类型的等式判断,称为等式类型
  • 等式类型包括整数、布尔值结合元组、表等构造子生成的类型

4.模式匹配

  • 模式与值进行匹配

    • 匹配成功,将产生一个绑定(binding)
    • 匹配不成功,声明就会失败

5.求值符号的使用

  • e=> e’ 一次推导
  • e=>* e’ 有限次推到
  • e=>+e’ 至少一次推导

三、模式匹配举例

fun eval ([]:int list):int=0| eval (d::L)=d+10*(eval L);
fun decimal (n:int):int list=if n<10 then [n]else (n mod 10)::decimal(n div 10);
fun exp(n:int):int=if n=0 then 1 else 2*exp(n-1);
fun square (x:int):int=x*x;
fun fastexp(n:int):int=if n=0 then 1 elseif n mod 2 = 0 then square(fastexp(n div 2))else 2*fastexp(n-1)
fun pow(n:int):int=case n of0=>1| 1=>2| _=>letval k=pow(n div 2)inif nmod 2 = 0 then k*k else 2*k*kend
fun badpow(n:int):int=case n of0=>1| 1=>2|  _=>letval k2=badpow(n div 2)*badpow(n div 2)in if n mod 2 = 0 then k2 else 2*k2;end
fun fib 0=1
| fib 1=1
| fib n=fib(n-1)+fib(n-2)

ML语言/函数式编程原理(一)相关推荐

  1. R语言函数式编程(Functional Programming)概念

    R语言函数式编程概念 functional 泛函 R语言的函数是first-class function 一等函数,higher-order function高阶函数,函数可以作为函数参数传入,这些特 ...

  2. python语言函数式编程模式_Python连载14-random模块函数式编程

    ​一.random模块 1.函数:random() (1)用法:获取0~1之间的随即小数 (2)格式:random.random() (3)返回值:随机0~1之间的小数 2.函数:choice() ( ...

  3. javascript函数式_JavaScript中的函数式编程原理

    javascript函数式 After a long time learning and working with object-oriented programming, I took a step ...

  4. Scala 函数式编程原理 第四课(Conditions and Value Definitions)

    到目前为止,我们学的Scala语法层面的东西还很少,基本上我们所学的都是"函数"和"函数式的程序"等概念.接下来,我们将介绍一些语法先关的东西. 几乎每一种计算 ...

  5. JavaScript中函数式编程的原理

    要了解JavaScript中的函数式编程原理,必须理解一下两个知识点: 1,JavaScript中函数.方法的调用 在JavaScript中,有两种调用函数的方式.一般的方式是把参数放在括号中,另一种 ...

  6. 响应式编程 函数式编程_函数式编程的基本原理简介

    响应式编程 函数式编程 After a long time learning and working with object-oriented programming, I took a step b ...

  7. Python的函数式编程--从入门到⎡放弃⎦

    很早以前就听说过了函数式编程,印象中是一种很晦涩难懂的编程模式,但却一直没有去进行了解. 恰好这周组内的周会轮到我主持,一时也没想到要分享什么.灵光一闪,就选定函数式编程这个主题吧,反正组里的同事都没 ...

  8. Python 函数式编程,从入门到放弃

    很早以前就听说过了函数式编程,印象中是一种很晦涩难懂的编程模式,但却一直没有去进行了解. 恰好这周组内的周会轮到我主持,一时也没想到要分享什么.灵光一闪,就选定函数式编程这个主题吧,反正组里的同事都没 ...

  9. fp函数式编程_全面了解函数式编程(FP)

    fp函数式编程 This is the other major programming paradigm. If you are interested in Objected oriented pro ...

  10. 翻译连载 | 第 10 章:异步的函数式(下)-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇...

    为什么80%的码农都做不了架构师?>>>    原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS> ...

最新文章

  1. Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.
  2. 机械转行的都干啥去了?机械转行计算机难吗?
  3. Oracle Flashback Database and Restore Points 说明
  4. 随机数计算html,随机数的产生方法 电脑随机数产生的计算具体方法
  5. HDU_oj_2050 折线分割平面
  6. win32格式化错误消息
  7. yolo v3配置文件说明模型配置文件——cfg/yolov3-voc.cfg
  8. 软件官网与memcached介绍
  9. 用c语言编程矩阵乘法,c语言矩阵相乘
  10. Python—实训day4—爬虫案例3:贴吧图片下载
  11. JS文件信息收集工具-LinkFinder
  12. android选项菜单xml,使用 XML 定义选项菜单
  13. unity控制程序等待_Unity 中的协同程序
  14. 关于“就地颠倒句子里的词”面试题
  15. java系列10:ArrayList
  16. ServletContextListener使用详解
  17. 此变量非彼变量(python变量)
  18. Codevs 3269 混合背包(二进制优化)
  19. NetDevOps常用数据库安装与基本操作--SQL数据库
  20. P2P网贷黎明前夕的黑夜---P2P是否要被封杀呢

热门文章

  1. 【Unity UGUI】屏幕坐标转换
  2. 苹果生产日期对照表2020_AirPods Pro 出现静电噪音,如何参与苹果免费维修服务计划?...
  3. 小米 win10 android 双系统,PC平板二合一 运行win10/安卓双系统
  4. MySql根据字段名查询重复记录并删除!只保留一条
  5. 童年十大经典玩耍游戏
  6. 北京智能机器人为游客指路;日本研发出可识别背影的人工智能
  7. python给excel排序_数据处理,Excel的排序功能,使用pandas在Python中轻松完成
  8. 磁珠 符号_磁珠简介_磁珠的命名、单位和选型
  9. 不到一个月用业余时间撸了个App
  10. RAID磁盘阵列有哪几种?