ocaml学习
ocaml与haskell一样,是functional programming的代表。
对于有一定编程经验的人来说,入手一种新语言,最有效的方式就是开发一些实用的utility,因此top-level肯定不能满足我们的需要。
对于ocaml来说,我们怎样才能生成一个命令行程序的PE文件呢?
先安装OPAM
参考:https://github.com/realworldocaml/book/wiki/Installation-Instructions
$ add-apt-repository ppa:avsm/ppa
$ apt-get update
$ apt-get install curl build-essential m4 ocaml opam
参考:
let ratio x y =
Float.of_int x /. Float.of_int y;;
val ratio : int -> int -> float = <fun>
下面一行是ocaml编译器给出的函数模型,
因为ocaml中将function视为一种value,因此会有val ratio,代表ratio是一个value.
:后面表示的是value的类型,可见这个value的类型,是将一个int转化成另外一个int,再将新的int转化成float,这似乎与我们定义的逻辑不符合,但是事实是,ratio x y 可以被视为
val ratio1 : int -> int = <fun>
val ratio2 : int -> float = <fun>
let ratio x y =
(ratio1 x) y
而(ratio1 x)本身返回就是一个function,因为function可以看作是value,所以可以被返回。
而(ratio1 x)返回的函数正是(ratio2).
tuple
let tuple_a = (3, "Three");;
val tuple_a : int * string = (3, "Three")
这里面对于tuple的类型给出的是用*连接的,*代表笛卡尔积,因为tuple可以是所有int和string类型的笛卡尔积。
pattern-matching
比如,我们知道有一个tuple是两个元素的,就可以使用(x, y)这种方式来提取其中的内容,这就是pattern-matching.
tuple vs list
tuple用于表示固定数目的不同类型元素的组合;
list用于表示任意数目的同种类型元素的组合。
tuple的元素之间用,来间隔,
而list的元素之间用;来间隔。
labeled argument
贴上了标签的参数,比如~f,这样可以使用名称而不是pos来标识参数。
list pattern-matching
[]和::用于list的元素中的模式匹配,这种匹配是左提取的。
match xxx with | | |匹配
类似于C++中的switch
recursive list functions
里面有两种case:
base case,
inductive case。
这类似于数学中的数学归纳法。
options
代表着一些参数可以存在,也可以不存在。
Some和None是创建optional value的构造函数。
然后可以通过
match option with
| Some x –>
| None –>
来检查option的值,并且根据情况作出处理。
如果指明类型时,某个类型是option,必须显式指明。
比如, 一个tuple,其中第一个允许是option
string option * string
Pervasives模块
默认每个ocaml程序都会打开这个模块。
let以及value的作用域
顶层的let是global作用的,而let里面的let是local的,而且必须配合in使用。
定义数据结构records
type point2d = {x:float ; y:float};;
可以使用下面三种pattern-matching来提取record中的元素
let func_a {x = x_pos; y= y_pos} =
x_pos + y_pos;;
let func_b { x;y } =
x + y;;
let_func_c v1 v2 =
v1.x + v2.x;;
variant type
变种类型,提供了不同实现类型在逻辑上的聚合。
可以理解为基类的抽象。
type shape =
| Circle of circle_imp
| Rect of rect_imp
| Triangle of triangle_imp;;
然后可以通过
match shape_a with
| Circel cir -> ...
| Rect rect -> ...
| Triangle tri -> ... ;;
来执行不同的操作。
这与option很相似。
ocaml学习的更多相关文章
- Erlang之父的学习历史及学习建议
当我开始学习编程的时候(1967年),我可以在 FORTRAN 和(传说中的)Algol 之间选择,不过没有任何人了解 Algol,所以我选择了 FORTRAN. 在我最早学习编程的时候,我的编程周期 ...
- thrift学习笔记
Thrift学习笔记 一:thrift介绍 Thrift是facebook开发的用来处理各不同系统之间数据通讯的rpc服务框架,后来成为apche的开源项目.thrift支持多种程序语言,包括Java ...
- Thrift学习
Thrift学习 一:thrift介绍 Thrift是facebook开发的用来处理各不同系统之间数据通讯的rpc服务框架,后来成为apche的开源项目.thrift支持多种程序语言,包括Java,P ...
- Thrift学习记录
Thrift学习记录 Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在C++,Java,Python,PHP,Ruby,Erlang, ...
- <转> Libvirt学习总结
感谢朋友支持本博客.欢迎共同探讨交流.因为能力和时间有限,错误之处在所难免,欢迎指正! 假设转载,请保留作者信息. 博客地址:http://blog.csdn.net/gaoxingnengjisua ...
- 分享收集的WebGL 3D学习资源
大家好,我在本文中分享了我收集的WebGL 3D相关的博客.书籍.教程.demo等内容,希望对大家学习WebGL和3D有所帮助,谢谢- 相关博客 Wonder技术 Wonder是我们的产品,包含Web ...
- 【Yaml】Yaml学习笔记
转载:https://blog.csdn.net/moshenglv/article/details/52084899 YAML何许物也?在XML泛滥的情况下,YAML的出现的确让人眼前一亮,在初步学 ...
- SWIG和PInvoke学习(1)
1. 简介 SWIG是个帮助使用C或者C++编写的软件能与其它各种高级编程语言进行嵌入联接的开发工具. SWIG能应用于各种不同类型的语言包括常用脚本编译语言例如Perl, PHP, Python, ...
- 2016年学习JavaScript是怎样的一种体验(转)
转自:http://www.zcfy.cc/article/how-it-feels-to-learn-javascript-in-2016-hacker-noon-1871.html 在这篇文章的写 ...
随机推荐
- 如何查看red gate安装时的log
安装界面,点击左上角的log open log file C:\Users\clu\AppData\Local\Temp\{69EEB6B0-A9AD-4BD4-8231-92C992F1FF05}\ ...
- Canal( 增量数据订阅与消费 )的理解及应用
canal是阿里巴巴旗下的一款开源项目,纯Java开发.基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了MySQL(也支持mariaDB). 起源:早期,阿里巴巴B2B公司因为存 ...
- 漫谈C语言结构体
相信大家对于结构体都不陌生.在此,分享出本人对C语言结构体的学习心得.如果你发现这个总结中有你以前所未掌握的,那本文也算是有点价值了.当然,水平有限,若发现不足之处恳请指出.代码文件test.c我放在 ...
- 从源码导入到github
http://stackoverflow.com/questions/4658606/import-existing-source-code-to-github If you've got local ...
- Linux下安装JDK(小白教程)
一. 选择与下载jdk 1. 官网上按照自己的系统版本下载相应jdk,因为我的LINUX(testbest)是32位的,所以我下载32位的jdk. 2. 官网下载地址:http://www. ...
- Linux NIO 系列(04-2) poll
目录 一.select 和 poll 比较 二.poll API 附1:linux 每个进程IO限制 附2:poll 网络编程 Linux NIO 系列(04-2) poll Netty 系列目录(h ...
- 深入JAVA虚拟机笔记-垃圾收集器与内存分配策略
第三章:垃圾收集器与内存分配 问题:1.哪些内存需要回收 2.什么时候回收 3.怎么回收 回收方法区:
- Spring入门之生命周期
好几日没有读东西了,今天本来要读mybatis原理部分,但是看到作者讲,只是学会用不用学那么深,遂直接开干spring,工作中一直用springboot,框架都是领导搭好的,每天的任务就是增删改查,挺 ...
- docker--image的获取
image有几种获取方式: 1.Docker官方提供了一种文件格式:Dockerfile,通过这种格式的文件,我们可以定义一个image,然后通过Dockerfile我们可以构建(build)一个im ...
- Elastic-Job分布式任务调度
任务调度是指系统为了自动完成特定任务,在约定的特定时刻去执行任务的过程,有了任务调度即可解放更多的人力由系统自动去执行任务. 多线程方式实现: Timer方式实现: ScheduledExecutor ...