interactive toplevel
Read-Eval-Print Loop
–REPL
ocaml
命令是一个基础的顶层环境
utop
则具有历史导航、自动完成等特性
;;
表示结束
ocamlbuild
*.native
1 | (* 这是一个单行的注释. *) |
Ocaml允许嵌套注释块
函数调用
没有括号和逗号 括号逗号组会被识别成pair
规则是 括号只括起整个函数调用 不要括起函数调用的参数
函数定义
强静态类型
动态/静态指做类型检查的时期 类型是否在编译时确定 影响使用数据前是否需要声明数据类型
强/弱定义 类型安全/不安全 能不能把一种类型当另外一种类型(除非强制转换) 一个变量能否赋不同类型的值 不是一个良定义的概念
type inference 类型推导 从而不支持重载
Ocaml不做任何隐式转换
1 | # let average a b = |
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
定义一个命名的局部表达式 直到;;
结束本代码块