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

  1. OCaml Language Sucks

    OCaml Language Sucks OCaml Language Sucks

  2. Github上的1000多本免费电子书重磅来袭!

    Github上的1000多本免费电子书重磅来袭!   以前 StackOverFlow 也给出了一个免费电子书列表,现在在Github上可以看到时刻保持更新的列表了. 瞥一眼下面的书籍分类目录,你就能 ...

  3. Github 的一个免费编程书籍列表

    Index Ada Agda Alef Android APL Arduino ASP.NET MVC Assembly Language Non-X86 AutoHotkey Autotools A ...

  4. [转]Keyword Reference (F#)

    Visual F# Development Portal http://msdn.microsoft.com/en-us/library/vstudio/ff730280.aspx 本文转自:http ...

  5. gentoo use-flag 全局标识 大全 (官方搬运) 英文 适用funtoo

    连接 https://www.gentoo.org/support/use-flags/ 提示 ctrl+F 可在页面查找 搬运 Global USE flags FlagDescription 3d ...

  6. function Language

    什么是函数式语言: 函数式语言(functional language)一类程序设计语言.是一种非冯·诺伊曼式的程序设计语言.函数式语言主要成分是原始函数.定义函数和函数型.这种语言具有较强的组织数据 ...

  7. Function program language

    历史 Lambda演算为描述函数及其评估提供了理论框架.它是一种数学抽象而不是编程语言 - 但它构成了几乎所有当前函数式编程语言的基础.等效的理论公式,组合逻辑,通常被认为比lambda演算更抽象,并 ...

  8. Functional Language

    1.What is functional language? 函数式语言(functional language)一类程序设计语言,是一种非冯·诺伊曼式的程序设计语言.函数式语言主要成分是原始函数.定 ...

  9. 函数式编程语言(functional language)

    内容根据百度词条整理! 转载请声明来源:https://baike.baidu.com/item/%E5%87%BD%E6%95%B0%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8 ...

  10. 函数式编程语言(Fuction Program Language)

    一.什么是函数式编程语言 函数式编程语言(functional progarm language)一类程序设计语言,是一种非冯·诺伊曼式的程序设计语言.函数式语言主要成分是原始函数.定义函数和函数型. ...

随机推荐

  1. [转帖]kubelet 原理解析三:runtime

    本文转自:https://feisky.xyz/posts/kube... 架构 Kubelet 架构图 Generic Runtime Manager:这是容器运行时的管理者,负责于 CRI 交互, ...

  2. 【转贴】2019.3 学习向SP打造指南 篇一:微软神器Surface产品线全系列详细介绍

    学习向SP打造指南 篇一:微软神器Surface产品线全系列详细介绍 2019-03-01 22:30:00 161点赞 699收藏 141评论 https://post.smzdm.com/p/a5 ...

  3. 简单定位占用最高CPU的java进程信息

    公司里面一个应用不小心点击就会导致系统性能下降很明显. 性能组的同事定位到了, 我这里以学习的态度重现一下这个过程. 1. 问题再现 产品一个非常大数据量的帮助, 点击之后就会占用非常多的cpu 因为 ...

  4. [专题]测试发现部分NVMe SSD的掉电数据保护功能让人失望

    https://www.cnbeta.com/articles/tech/1240441.htm 这个有点过分了. 苹果开发者 Russ Bishop 在一份测试报告中指出:即使掉电保护已经是个绕不开 ...

  5. css伪类和伪元素在项目中的使用-红色*显示

    CSS使用伪类给表单添加星号 <style type="text/css"> .form-item label::before { content: '*'; colo ...

  6. Fabric网络升级(二)

    原文来自这里. 如果想了解最新版Fabric的特殊事项,详见Upgrading to the latest release of Fabric. 本章只介绍更新Fabric组件的操作.关于如何通过编辑 ...

  7. 几种方法验证unity是否为development build

    我在月初接入了uwa的性能测试SDK,需要提交一个development build的游戏安装包给uwa进行真人真机测试,本文说下如何判断安装包是否为development build. 直观上判断 ...

  8. vim 从嫌弃到依赖(17)——查找模式

    最开始介绍vim的时候,提到vim有普通模式.插入模式.可视模式和命令行模式,并且已经对这几个模式做了详细的介绍了.除了这几个模式以外,vim还有一个非常强大的模式--查找模式,为什么最开始没有将其列 ...

  9. 来啦!2020 Java开源项目权威排名解读:Spring Boot排名稳定、Shiro未上榜

    这篇文章对于我们做技术选型以及技术学习都有极强的指导性作用,建议收藏! 原创不易,若有帮助,欢迎点赞! 推荐: 接近100K star 的Java学习/面试指南 Github 95k+点赞的Java面 ...

  10. GPTs prompts灵感库:创意无限,专业级创作指南,打造吸睛之作的秘诀

    GPTs prompts灵感库:创意无限,专业级创作指南,打造吸睛之作的秘诀 优质prompt展示 1.1 极简翻译 中英文转换 你是一个极简翻译工具,请在对话中遵循以下规则: - Prohibit ...