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

参考:

http://zh.wikibooks.org/wiki/User:Gqqnb/OCaml%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B/%EF%BC%88%E4%B8%80%EF%BC%89%E7%AE%80%E4%BB%8B

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学习的更多相关文章

  1. Erlang之父的学习历史及学习建议

    当我开始学习编程的时候(1967年),我可以在 FORTRAN 和(传说中的)Algol 之间选择,不过没有任何人了解 Algol,所以我选择了 FORTRAN. 在我最早学习编程的时候,我的编程周期 ...

  2. thrift学习笔记

    Thrift学习笔记 一:thrift介绍 Thrift是facebook开发的用来处理各不同系统之间数据通讯的rpc服务框架,后来成为apche的开源项目.thrift支持多种程序语言,包括Java ...

  3. Thrift学习

    Thrift学习 一:thrift介绍 Thrift是facebook开发的用来处理各不同系统之间数据通讯的rpc服务框架,后来成为apche的开源项目.thrift支持多种程序语言,包括Java,P ...

  4. Thrift学习记录

    Thrift学习记录 Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在C++,Java,Python,PHP,Ruby,Erlang, ...

  5. &lt;转&gt; Libvirt学习总结

    感谢朋友支持本博客.欢迎共同探讨交流.因为能力和时间有限,错误之处在所难免,欢迎指正! 假设转载,请保留作者信息. 博客地址:http://blog.csdn.net/gaoxingnengjisua ...

  6. 分享收集的WebGL 3D学习资源

    大家好,我在本文中分享了我收集的WebGL 3D相关的博客.书籍.教程.demo等内容,希望对大家学习WebGL和3D有所帮助,谢谢- 相关博客 Wonder技术 Wonder是我们的产品,包含Web ...

  7. 【Yaml】Yaml学习笔记

    转载:https://blog.csdn.net/moshenglv/article/details/52084899 YAML何许物也?在XML泛滥的情况下,YAML的出现的确让人眼前一亮,在初步学 ...

  8. SWIG和PInvoke学习(1)

    1. 简介 SWIG是个帮助使用C或者C++编写的软件能与其它各种高级编程语言进行嵌入联接的开发工具. SWIG能应用于各种不同类型的语言包括常用脚本编译语言例如Perl, PHP, Python, ...

  9. 2016年学习JavaScript是怎样的一种体验(转)

    转自:http://www.zcfy.cc/article/how-it-feels-to-learn-javascript-in-2016-hacker-noon-1871.html 在这篇文章的写 ...

随机推荐

  1. Redis入门很简单之二【常见操作命令】

    Redis入门很简单之二[常见操作命令] 博客分类: NoSQL/Redis/MongoDB redisnosql缓存  Redis提供了丰富的命令,允许我们连接客户端对其进行直接操作.这里简单介绍一 ...

  2. *.tar 用 tar –xvf 解压 *.gz 用 gzip -d或者gunzip 解压 *.tar.gz和*.tgz 用 tar –xzf 解压 *.bz2 用 bzip2 -d或者用bunzip2 解压 、*.tar.bz2用tar –xjf 解压

    解压: 1.*.tar 用 tar –xvf 解压, --skip-old-files跳过已经存在的文件,压缩用tar -cvf 2.*.bz2 用 bzip2 -d或者用bunzip2 解压 3.* ...

  3. 87、使用TensorBoard进行可视化学习

    1.还是以手写识别为类,至于为什么一直用手写识别这个例子,原因很简单,因为书上只给出了这个类子呀,哈哈哈,好神奇 下面是可视化学习的标准函数 ''' Created on 2017年5月23日 @au ...

  4. 关闭禁用 Redis 危险命令

    Redis 的危险命令主要有: flushdb,清空数据库 flushall,清空所有记录,数据库 config,客户端连接后可配置服务器 keys,客户端连接后可查看所有存在的键,当 redis k ...

  5. 【消息中间件】kafka

    一.kafka整体架构 kafka是一个发布订阅模式的消息队列,生产者和消费者是多对多的关系,将发送者与接收者真正解耦: 生产者将消息发送到broker: 消费者采用拉(pull)模式订阅并消费消息: ...

  6. AutoFac控制反转 转载https://blog.csdn.net/u011301348/article/details/82256791

    一.AutoFac介绍 Autofac是.NET里IOC(Inversion of Control,控制反转)容器的一种,同类的框架还有Spring.NET,Unity,Castle等.可以通过NuG ...

  7. 2019ccpc网络赛hdu6703 array(线段树)

    array 题目传送门 解题思路 操作1是把第pos个位置上的数加上\(10^7\),操作2是找到区间[1,r]中没有且大于k的最小的数.注意到k的范围是小于等于n的,且n的范围是\(10^5\),远 ...

  8. nginx-413

    修改nginx配置文件:client_max_body_size 300M 修改php.ini upload_max_filesize | post_max_size

  9. Java数据类型简介

    Java数据类型 以下两行Java代码定义了两个整数:num1和num2: num1和num2是两个int类型的变量. int关键字指定它的后面是变量的名称,并表示数据类型整数,例如:10,15,70 ...

  10. 用户界面样式(cursor,resize,vertical-align,outline,文字超出显示省略号)

    1. 鼠标样式 cursor default: 小白(箭头)默认 pointer:小手 move:移动 text:文本 not-allowed:禁止 2. 轮廓线(表单外发光)outline 给表单添 ...