OCaml
OCaml is a functional programming language in the ML family, an extension of the Caml language with object-oriented constructs.
This page aims to cover some of its differences from Haskell.
Conceptual differences[edit]
OCaml is strict by default, although it has some facility for introducing laziness.
OCaml's let is non-recursive by default, but has the form let rec for defining recursive functions.
OCaml is impure: although it makes heavy use of immutable data, it also has mutable references and arrays available, and IO is performed by ordinary functions.
Syntactic dictionary[edit]
Haskell | OCaml | Comments | |
Anonymous functions |
\x y -> ... |
fun x y -> ... |
|
Multiple assignments |
let x = 4 y = 5 in ... |
let x = 4 and y = 5 in ... |
|
Types |
Int, Bool, (Double, Char), a |
int, bool, float * char, 'a |
float is double-precision |
Type signatures |
const :: a -> b -> a |
const : 'a -> 'b -> 'a |
Signatures usually omitted in OCaml implementations, may be provided separately in interface files |
Type declarations |
data A = B Int | C Char Bool x = B 3 y = C 'a' True |
type a = B of int | C of char * bool let x = B 3 and y = C ('a', true) |
|
Parametrised types |
data DList a = MkDList ([a] -> [a]) data Either a b = Left a | Right b |
type 'a dlist = MkDList of ('a list -> 'a list) type ('a, 'b) either = Left of 'a | Right of 'b | |
Pattern matching |
case x of B x | x > 0 -> ... | otherwise -> ... C a b -> ... case Left () of Left x -> x Right x -> x |
match x with B x when x > 0 -> ... | B x -> ... | C (a, b) -> ... match Left () with Left x | Right x -> x |