ML语言/函数式编程原理(一)
函数式编程原理
一、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语言/函数式编程原理(一)相关推荐
- R语言函数式编程(Functional Programming)概念
R语言函数式编程概念 functional 泛函 R语言的函数是first-class function 一等函数,higher-order function高阶函数,函数可以作为函数参数传入,这些特 ...
- python语言函数式编程模式_Python连载14-random模块函数式编程
一.random模块 1.函数:random() (1)用法:获取0~1之间的随即小数 (2)格式:random.random() (3)返回值:随机0~1之间的小数 2.函数:choice() ( ...
- javascript函数式_JavaScript中的函数式编程原理
javascript函数式 After a long time learning and working with object-oriented programming, I took a step ...
- Scala 函数式编程原理 第四课(Conditions and Value Definitions)
到目前为止,我们学的Scala语法层面的东西还很少,基本上我们所学的都是"函数"和"函数式的程序"等概念.接下来,我们将介绍一些语法先关的东西. 几乎每一种计算 ...
- JavaScript中函数式编程的原理
要了解JavaScript中的函数式编程原理,必须理解一下两个知识点: 1,JavaScript中函数.方法的调用 在JavaScript中,有两种调用函数的方式.一般的方式是把参数放在括号中,另一种 ...
- 响应式编程 函数式编程_函数式编程的基本原理简介
响应式编程 函数式编程 After a long time learning and working with object-oriented programming, I took a step b ...
- Python的函数式编程--从入门到⎡放弃⎦
很早以前就听说过了函数式编程,印象中是一种很晦涩难懂的编程模式,但却一直没有去进行了解. 恰好这周组内的周会轮到我主持,一时也没想到要分享什么.灵光一闪,就选定函数式编程这个主题吧,反正组里的同事都没 ...
- Python 函数式编程,从入门到放弃
很早以前就听说过了函数式编程,印象中是一种很晦涩难懂的编程模式,但却一直没有去进行了解. 恰好这周组内的周会轮到我主持,一时也没想到要分享什么.灵光一闪,就选定函数式编程这个主题吧,反正组里的同事都没 ...
- fp函数式编程_全面了解函数式编程(FP)
fp函数式编程 This is the other major programming paradigm. If you are interested in Objected oriented pro ...
- 翻译连载 | 第 10 章:异步的函数式(下)-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇...
为什么80%的码农都做不了架构师?>>> 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS> ...
最新文章
- Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.
- 机械转行的都干啥去了?机械转行计算机难吗?
- Oracle Flashback Database and Restore Points 说明
- 随机数计算html,随机数的产生方法 电脑随机数产生的计算具体方法
- HDU_oj_2050 折线分割平面
- win32格式化错误消息
- yolo v3配置文件说明模型配置文件——cfg/yolov3-voc.cfg
- 软件官网与memcached介绍
- 用c语言编程矩阵乘法,c语言矩阵相乘
- Python—实训day4—爬虫案例3:贴吧图片下载
- JS文件信息收集工具-LinkFinder
- android选项菜单xml,使用 XML 定义选项菜单
- unity控制程序等待_Unity 中的协同程序
- 关于“就地颠倒句子里的词”面试题
- java系列10:ArrayList
- ServletContextListener使用详解
- 此变量非彼变量(python变量)
- Codevs 3269 混合背包(二进制优化)
- NetDevOps常用数据库安装与基本操作--SQL数据库
- P2P网贷黎明前夕的黑夜---P2P是否要被封杀呢
热门文章
- 【Unity UGUI】屏幕坐标转换
- 苹果生产日期对照表2020_AirPods Pro 出现静电噪音,如何参与苹果免费维修服务计划?...
- 小米 win10 android 双系统,PC平板二合一 运行win10/安卓双系统
- MySql根据字段名查询重复记录并删除!只保留一条
- 童年十大经典玩耍游戏
- 北京智能机器人为游客指路;日本研发出可识别背影的人工智能
- python给excel排序_数据处理,Excel的排序功能,使用pandas在Python中轻松完成
- 磁珠 符号_磁珠简介_磁珠的命名、单位和选型
- 不到一个月用业余时间撸了个App
- RAID磁盘阵列有哪几种?