The OCaml Language Cheatsheets
The OCaml Language Cheatsheets
OCaml v.4.08.1
Syntax
Implementations are in .ml files, interfaces are in .mli files.
Comments can be nested, between delimiters (*...*)
Integers: 123, 1_000, 0x4533, 0o773, 0b1010101
Chars: 'a', '\255', '\xFF', '\n'
Floats: 0.1, -1.234e-34
Data Types
unit: (* void, takes only one value: () *)
int: (* integer of either 31 or 63 bits, like 42 *)
int32: (* 32 bits Integer, like 42l *)
int64: (* 64 bits Integer, like 42L *)
float: (* double precision float, like 1.0 *)
bool: (* boolean, takes two values: true or false *)
char: (* simple ASCII characters, like 'A' *)
string: (* strings, like "Hello" or foo|Hello|foo *)
bytes: (* mutable string of chars *)
'a list : (* lists, like head :: tail or [1;2;3] *)
'a array: (* arrays, like [|1;2;3|] *)
t1 * ... * tn: (* tuples, like (1, "foo", 'b') *)
Constructed Types
type record = (* new record type *)
{ field1 : bool; (* immutable field *)
mutable field2 : int; } (* mutable field *)
type enum = (* new variant type *)
| Constant (* Constant constructor *)
| Param of string (* Constructor with arg*)
| Pair of string * int (* Constructor with args *)
| Gadt : int -> enum (* GADT constructor *)
| Inlined of { x : int } (* Inline record *)
Constructed Values
let r = { field1 = true; field2 = 3; }
let r' = { r with field1 = false }
r.field2 <- r.field2 + 1;
let c = Constant
let c = Param "foo"
let c = Pair ("bar",3)
let c = Gadt 0
let c = Inlined { x = 3 }
References, Strings and Arrays
let x = ref 3 (* integer reference (mutable) *)
x := 4 (* reference assignation *)
print_int !x; (* reference access *)
s.[0] (* string char access *)
t.(0) (* array element access *)
t.(0) <- x (* array element modification *)
Imports - Namespaces
open Unix (* global open *)
let open Unix in expr (* local open *)
Unix.(expr) (* local open *)
Functions
let f x = expr (* function with one arg *)
let rec f x = expr (* recursive function, apply: f x *)
let f x y = expr (* with two args, apply: f x y *)
let f (x,y) = expr (* with a pair as arg, apply: f (x,y) *)
List.iter (fun x -> expr) (* anonymous function *)
let f = function None -> act (* function definition *)
| Some x -> act (* function definition [by cases] *)
(* apply: f (Some x) *)
let f ~str ~len = expr (* with labeled args *)
(* apply: f ~str:s ~len:10 *)
(* apply: (for ~str:str): f ~str ~len *)
let f ?len ~str = expr (* with optional arg (option) *)
let f ?(len=0) ~str = expr (* optional arg default *)
(* apply (with omitted arg): f ~str:s *)
(* apply (with commuting): f ~str:s ~len:12 *)
(* apply (len: int option): f ?len ~str:s *)
(* apply (explicitly omitted): f ?len:None ~str:s *)
let f (x : int) = expr (* arg has constrainted type *)
let f : 'a 'b. 'a*'b -> 'a (* function with constrainted *)
= fun (x,y) -> x (* polymorphic type *)
Modules
module M = struct .. end (* module definition *)
module M: sig .. end= struct .. end (* module and signature *)
module M = Unix (* module renaming *)
include M (* include items from *)
module type Sg = sig .. end (* signature definition *)
module type Sg = module type of M (* signature of module *)
let module M = struct .. end in .. (* local module *)
let m = (module M : Sg) (* to 1st-class module *)
module M = (val m : Sg) (* from 1st-class module *)
module Make(S: Sg) = struct .. end (* functor *)
module M = Make(M') (* functor application *)
Module type items: val, external, type, exception, module, open, include, class
Pattern-matching
match expr with
| pattern -> action
| pattern when guard -> action (* conditional case *)
| _ -> action (* default case *)
Patterns:
| Pair (x,y) -> (* variant pattern *)
| { field = 3; _ } -> (* record pattern *)
| head :: tail -> (* list pattern *)
| [1;2;x] -> (* list pattern *)
| (Some x) as y -> (* with extra binding *)
| (1,x) | (x,0) -> (* or-pattern *)
| exception exn -> (* try&match *)
Conditionals
Do NOT use on closures
x = y (* (Structural) Polymorphic Equality *)
x == y (* (Physical) Polymorphic Inequality *)
x <> y (* (Structural) Polymorphic Equality *)
x != y (* (Physical) Polymorphic Inequality *)
compare x y (* negative, when x < y *)
compare x y (* 0, when x = y *)
compare x y (* positive, when x > y *)
Other Polymorphic Comparisons: >, >=, <, <=
Loops
while cond do ... done;
for var = min_value to max_value do ... done;
for var = max_value downto min_value do ... done;
Exceptions
exception MyExn (* new exception *)
exception MyExn of t * t' (* same with arguments *)
exception MyFail = Failure (* rename exception with args *)
raise MyExn (* raise an exception *)
raise (MyExn (args)) (* raise with args *)
try expr (* catch MyExn *)
with MyExn -> ... (* if raised in expr *)
Objects and Classes
class virtual foo x = (* virtual class with arg *)
let y = x+2 in (* init before object creation *)
object (self: 'a) (* object with self reference *)
val mutable variable = x (* mutable instance variable *)
method get = variable (* accessor *)
method set z =
variable <- z+y (* mutator *)
method virtual copy : 'a (* virtual method *)
initializer (* init after object creation *)
self#set (self#get+1)
end
class bar = (* non-virtual class *)
let var = 42 in (* class variable *)
fun z -> object (* constructor argument *)
inherit foo z as super (* inheritance and ancestor reference *)
method! set y = (* method explicitly overridden *)
super#set (y+4) (* access to ancestor *)
method copy = {< x = 5 >} (* copy with change *)
end
let obj = new bar 3 (* new object *)
obj#set 4; obj#get (* method invocation *)
let obj = object .. end (* immediate object *)
Polymorphic variants
type t = [ `A | `B of int ] (* closed variant *)
type u = [ `A | `C of float ]
type v = [ t | u | ] (* union of variants *)
let f : [< t ] -> int = function (* argument must be a subtype of t *)
| `A -> 0 | `B n -> n
let f : [> t ] -> int = function (* t is subtype of the argument *)
|`A -> 0 | `B n -> n | _ -> 1
Reference
The OCaml Language Cheatsheets的更多相关文章
- OCaml Language Sucks
OCaml Language Sucks OCaml Language Sucks
- Github上的1000多本免费电子书重磅来袭!
Github上的1000多本免费电子书重磅来袭! 以前 StackOverFlow 也给出了一个免费电子书列表,现在在Github上可以看到时刻保持更新的列表了. 瞥一眼下面的书籍分类目录,你就能 ...
- Github 的一个免费编程书籍列表
Index Ada Agda Alef Android APL Arduino ASP.NET MVC Assembly Language Non-X86 AutoHotkey Autotools A ...
- [转]Keyword Reference (F#)
Visual F# Development Portal http://msdn.microsoft.com/en-us/library/vstudio/ff730280.aspx 本文转自:http ...
- gentoo use-flag 全局标识 大全 (官方搬运) 英文 适用funtoo
连接 https://www.gentoo.org/support/use-flags/ 提示 ctrl+F 可在页面查找 搬运 Global USE flags FlagDescription 3d ...
- function Language
什么是函数式语言: 函数式语言(functional language)一类程序设计语言.是一种非冯·诺伊曼式的程序设计语言.函数式语言主要成分是原始函数.定义函数和函数型.这种语言具有较强的组织数据 ...
- Function program language
历史 Lambda演算为描述函数及其评估提供了理论框架.它是一种数学抽象而不是编程语言 - 但它构成了几乎所有当前函数式编程语言的基础.等效的理论公式,组合逻辑,通常被认为比lambda演算更抽象,并 ...
- Functional Language
1.What is functional language? 函数式语言(functional language)一类程序设计语言,是一种非冯·诺伊曼式的程序设计语言.函数式语言主要成分是原始函数.定 ...
- 函数式编程语言(functional language)
内容根据百度词条整理! 转载请声明来源:https://baike.baidu.com/item/%E5%87%BD%E6%95%B0%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8 ...
- 函数式编程语言(Fuction Program Language)
一.什么是函数式编程语言 函数式编程语言(functional progarm language)一类程序设计语言,是一种非冯·诺伊曼式的程序设计语言.函数式语言主要成分是原始函数.定义函数和函数型. ...
随机推荐
- [转帖]Linux内核网络中的软中断ksoftirqd
https://zhuanlan.zhihu.com/p/361976930 1. 前言 之前分享过Linux内核网络数据包的接收过程,当执行到网卡通过硬件中断(IRQ)通知CPU,告诉它有数据来了, ...
- 【转】Java类加载器:类加载原理解析
[转]Java类加载器:类加载原理解析 https://www.jianshu.com/p/1f704ad4196e 摘要: 每个开发人员对java.lang.ClassNotFoundExcetpi ...
- sed 删除部分行以及删除包含某些行的命令
sed的简单学习 前言: 最近进行mysql数据库的备份恢复操作,发现source 命令执行时数据库表的速度非常缓慢, 本来想通过这种方式处理一下,能够减少数据备份的处理. 删除包含内容的信息 sed ...
- vue/cli的配置详解
查看vue/cli的配置 vue的脚手架隐藏了所有的webpack相关的配置,若是想要查看webpack的配置 你可以去执行 vue inspect > output.js 这样就可以查看它的配 ...
- Vue中is属性的用法 可以动态切换组件
is 是组件的一个属性,用来展示组件的名称 is和component联用哈 vue提供了component来展示对应的组件名称 compont是一个占位符,is这个属性,用来展示对应的组件名称 三个子 ...
- 小白学k8s(11)-k8s中Secret理解
理解Secret 什么是Secret Secret的类型 Opaque Secret Opaque Secret的使用 将Secret挂载到Volume中 挂载的Secret会被自动更新 将Secre ...
- 2.6 CE修改器:代码注入功能
从本关开始,各位会初步接触到CE的反汇编功能,这也是CE最强大的功能之一.在第6关的时候我们说到指针的找法,用基址定位动态地址.但这一关不用指针也可以进行修改,即使对方是动态地址,且功能更加强大.代码 ...
- 5.11 汇编语言:仿写IF条件语句
条件语句,也称为IF-ELSE语句,是计算机编程中的一种基本控制结构.它允许程序根据条件的真假来执行不同的代码块.条件语句在处理决策和分支逻辑时非常有用.一般来说,条件语句由IF关键字.一个条件表达式 ...
- UDP通信 [补档-2023-07-22]
UDP通信 6-1 简介 UDP通信是面向无链接的,不稳定,不可靠,不安全的一种通信方式.TCP在通信前发送方会向接收方进行三次握手链接,然后确认双方链接后才会进行数据传输,最后四次挥手保证链接关 ...
- Pdfium.Net.Free 一个免费的Pdfium的 .net包装器--打开大文件处理
项目地址: Pdfium.Net:https://github.com/1000374/Pdfium.Net PdfiumViewer:https://github.com/1000374/Pdfiu ...