interactive toplevel

Read-Eval-Print LoopREPL

ocaml命令是一个基础的顶层环境

utop则具有历史导航、自动完成等特性

;;表示结束

ocamlbuild *.native

1
2
3
4
5
6
(* 这是一个单行的注释. *)

(* 这是一个
* 多行
* 的注释.
*)

Ocaml允许嵌套注释块

函数调用

没有括号和逗号 括号逗号组会被识别成pair

规则是 括号只括起整个函数调用 不要括起函数调用的参数

函数定义

强静态类型

动态/静态指做类型检查的时期 类型是否在编译时确定 影响使用数据前是否需要声明数据类型

强/弱定义 类型安全/不安全 能不能把一种类型当另外一种类型(除非强制转换) 一个变量能否赋不同类型的值 不是一个良定义的概念

type inference 类型推导 从而不支持重载

Ocaml不做任何隐式转换

1
2
# let average a b =
(a +. b) /. 2.0;;val average : float -> float -> float = <fun>

Ocaml为实现gc,占用了int的一位,因此Ocaml中的int是31位/63位

大数模块Big_int Nat

32位int 无符号int nativeint

Ocaml没有单精度浮点数

Unicode和UTF-8类型需要用comprehensive Unicode libraryies来处理

字符串不只是字符链表

float_of_int int_of_float char_of_int int_of_char string_of_int

简写 float i +. f;;

类型和函数同名在OCaml中是完全合法的

递归函数定义需要用let rec ==(为什么?没看懂)==

let允许用变量本身进行重新定义

与其他函数式编程语言类似,OCaml的“变量”是不可变的,所以与其说是变量,更应该理解成是一种绑定关系。而ML衍生的语言是可以重新绑定的,而原来的值依然存在,只不过是被新绑定隐藏掉了,并不是一般面向过程语言中的变量赋值。

1
f : arg1 -> arg2 -> ... -> argn -> rettype

currying

'a

let name = expression in定义一个命名的局部表达式 直到;;结束本代码块