Ocaml入门(3)

如果在centos环境下配置好了opam,安装好了ocaml, core, utop,接下来就可以开始学习ocaml了。

跟随《Real world Ocaml》的脚步来学吧。网上有html版。

先概览一下。

普通的数字计算

ocaml很在乎类型,浮点数和整数类型运算符不能混用。

utop # 3 + 4;;
- : int = 7  

utop # 3.1 + 4.2;;
Error: This expression has type float
but an expression was expected of type int 

utop # 3.1 +. 4.2;;
- : float = 7.3  

整数数位如很多,为清晰起见,可以使用下划线分开:

utop # 100_000 / 1000;;
- : int = 100 

可以把值绑定绑定到符号。在最顶层绑定相当于其它语言的“全局变量”。

变量名可以含有引号(数学上的用法),可以用小写字母或下划线开始。

utop # let x = 5;;
val x : int = 5
utop # let x‘ = 6;;
val x‘ : int = 6
utop # let _x = x + x‘;;

注意,下划线开始的变量,utop不去打印它的值,但你直接访问该变量值是可以的。
虽然名字叫“变量”,其实和其它语言的变量不一样,ocaml中的变量是“不变”的,ocaml更鼓励重新绑定,而不是修改变量的值。

很多函数式语言都是这个观点。

函数

函数当然是函数式语言的核心。

函数在此处是“一等公民”,像其它语言中的int,double一样基本,有类型,可传递,可加工,可复合,可偏参等许多花样。

utop # let dd x = x * x;;
val dd : int -> int = <fun>
utop # dd 5;;
- : int = 25 

当然,可以多个参数

utop # let myadd x y = x * 10 + y;;
val myadd : int -> int -> int = <fun>
utop # myadd 5 7;;
- : int = 57 

TUPLES

很多高级语言的函数都可以传入多个参数,但最多只能返回一个值。如果需要返回多个值很麻烦。

ocaml提供tuple类型可以解决这个问题。

utop # let mydiv x y = x/y, x mod y;;
val mydiv : int -> int -> int * int = <fun>
utop # mydiv 10 3;;
- : int * int = (3, 1)  

tuple 类型就是用逗号分开的值,最好外边加小括号。
注意系统返回的类型。

ocaml支持“解构赋值”,这对取得tuple中的数据来说很方便。

utop # let (a,b) = mydiv 10 3;;
val a : int = 3
val b : int = 1 
utop # let distance (x1,y1) (x2,y2) =
  sqrt((x1 -. x2) ** 2. +. (y1 -. y2) ** 2.);;
val distance : float * float -> float * float -> float = <fun>
utop # distance (1.0, 1.0) (2.0, 2.0);;
- : float = 1.41421356237   

上边的代码说明,“解构”可以用在参数位置,这十分方便。

Lists

utop # let an = ["cat";"bird";"elephant"];;
val an : string list = ["cat"; "bird"; "elephant"] 

注意,此处元素间的分割是分号,不是逗号。很无奈,逗号是用来分割tuple元素的。

utop # List.map String.length an;;
- : int list = [3; 4; 8] 

列表的写法是“语法糖”,实际上是逐渐构造的。

utop # 1::2::3::[];;
- : int list = [1; 2; 3]   

list可以运算:

utop # [1;2;3] @ [4;5];;
- : int list = [1; 2; 3; 4; 5]   

列表也可以进行“解构”绑定:

utop # let h::t = [1;2;3;4];;
Characters 4-8:
Warning 8: this pattern-matching is not exhaustive.
 Here is an example of a value that is not matched:   []
val h : int = 1
val t : int list = [2; 3; 4]

列表的经典动作,取得“头元素”和剩余的部分

之所以有Warning,是因为从语法角度看,如果右边的列表是个空的,左边就无法解构了,会出异常。
可以用match语句来避免,相当于其它语言的分支。

utop # let f x = match x with
| [] -> 0
| (h::t) -> h;;
val f : int list -> int = <fun>
utop # f [1;2;3;4];;
- : int = 1
utop # f [];;
- : int = 0     
时间: 2024-10-29 04:27:46

Ocaml入门(3)的相关文章

Ocaml入门-1

Ocaml是函数语言.Lisp, Haskell,clojure,scala等也是. 函数式语言的特色是:函数本身是“第一等公民”,它可以被当做参数传递,被当做参数返回. 函数式语言之所以“回暖”可能是因为当前多cpu,分布式,并行计算对软件如何处理并发提出新的挑战. 函数式在并发上有天然优势. 在函数式语言中,Ocaml的主要优势是: 1. 有坚实的学院派理论基础,数学模型严谨. 2. 据称是史上运行速度第二的高级语言(第一毫无疑问是c) 也就是说Ocaml甚至比c++还快. 如何安装ocam

OCaml入门(5)

匿名函数 函数式语言中,函数是一等公民,它应该可以像其它类型(int,float,string等)一样,能支持“字面量”,这就是匿名函数. utop # (fun x -> x + 1);; - : int -> int = <fun> utop # (fun x -> x + 1) 7;; - : int = 8 可以看到,匿名函数可以代替函数的位置来使用. 有些函数需要的参数是另一个函数,当然也可以用匿名函数传入.比如: utop # List.map ~f:(fun x

Ocaml入门(2)

假设你已经在centos7上,使用su权限安装好了opam,下面回到普通权限.使用opam来安装其它东西. opam 安装的东西,默认都在 ~/.opam 目录下,它没有权限改变系统目录的东西. 如果配置有问题,很简单.删除 ~/.opam 目录,一切从新来过! 1. opam init 初始化环境,一路yes下去就可以了. 检验是否成功的标准,看环境变量是否添加好: printenv OCAML_TOPLEVEL_PATH 有的时候,可能会需要执行一下如下的指令: eval `opam con

RPC学习----Thrift快速入门和Java简单示例

一.什么是RPC? RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据.在OSI网络通信模型中,RPC跨越了传输层和应用层.RPC使得开发包括网络分布式多程序在内的应用程序更加容易. 二.什么是Thrift? thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和

Thrift入门及Java实例演示&lt;转载备用&gt;

Thrift入门及Java实例演示 作者: Michael 日期: 2012 年 6 月 14 日 •概述 •下载配置 •基本概念 1.数据类型 2.服务端编码基本步骤 3.客户端编码基本步骤 4.数据传输协议 •实例演示(java) 1. thrift生成代码 2. 实现接口Iface 3.TSimpleServer服务模型 4.TThreadPoolServer 服务模型 5.TNonblockingServer 服务模型 6.THsHaServer服务模型 7.异步客户端 [一].概述 T

R语言快速上手入门

R语言快速上手入门 课程学习网址:http://www.xuetuwuyou.com/course/196 课程出自学途无忧网:http://www.xuetuwuyou.com 课程简介 本教程深入浅出地讲解如何使用R语言玩转数据.课程中涵盖R语言编程的方方面面,内容涉及R对象的类型.R的记号体系和环境系统.自定义函数.if else语句.for循环.S3类R的包系统以及调试工具等.本课程还通过示例演示如何进行向量化编程,从而对代码进行提速并尽可能地发挥R的潜能.本课程适合立志成为数据科学家的

笔记:Spring Cloud Zuul 快速入门

Spring Cloud Zuul 实现了路由规则与实例的维护问题,通过 Spring Cloud Eureka 进行整合,将自身注册为 Eureka 服务治理下的应用,同时从 Eureka 中获取了所有其他微服务的实例信息,这样的设计非常巧妙的将服务治理体系中维护的实例信息利用起来,使得维护服务实例的工作交给了服务治理框架自动完成,而对路由规则的维护,默认会将通过以服务名作为 ContextPath 的方式来创建路由映射,也可以做一些特别的配置,对于签名校验.登录校验等在微服务架构中的冗余问题

linux入门基础知识及简单命令介绍

linux入门基础知识介绍 1.计算机硬件组成介绍 计算机主要由cpu(运算器.控制器),内存,I/O,外部存储等构成. cpu主要是用来对二进制数据进行运算操作,它从内存中取出数据,然后进行相应的运算操作.不能从硬盘中直接取数据. 内存从外部存储中取出数据供cpu运存.内存的最小单位是字节(byte) 备注:由于32的cpu逻辑寻址能力最大为32内存单元.因此32位cpu可以访问的最大内存空间为:4GB,算法如下: 2^32=2^10*2^10*2^10*2^2 =1024*1024*1024

JAVA通信系列二:mina入门总结

一.学习资料 Mina入门实例(一) http://www.cnblogs.com/juepei/p/3939119.html Mina入门教程(二)----Spring4 集成Mina http://www.cnblogs.com/juepei/p/3940396.html Apache Mina 入门实例--创建一个MINA时间服务http://loftor.com/archives/apache-mina-quick-start-guide.html MINA2.0用户手册中文版--系列文