OCaml: Difference between revisions
Benmachine (talk | contribs) mNo edit summary |
Benmachine (talk | contribs) (clarifications on comments) Tag: visualeditor-switched |
||
(3 intermediate revisions by the same user not shown) | |||
Line 43: | Line 43: | ||
| | | | ||
int, bool, float * char, 'a | int, bool, float * char, 'a | ||
| <tt>float</tt> is | | <tt>float</tt> is double-precision | ||
|- | |- | ||
| Type signatures | | Type signatures | ||
Line 50: | Line 50: | ||
| | | | ||
const : 'a -> 'b -> 'a | const : 'a -> 'b -> 'a | ||
| Signatures usually omitted in OCaml | | Signatures usually omitted in OCaml implementations, may be provided separately in interface files | ||
|- | |- | ||
| Type declarations | | Type declarations | ||
Line 65: | Line 65: | ||
| Parametrised types | | Parametrised types | ||
| | | | ||
data | data DList a = MkDList ([a] -> [a]) | ||
data | data Either a b = Left a | Right b | ||
| | | | ||
type 'a | type 'a dlist = MkDList of ('a list -> 'a list) | ||
type ('a, 'b) | type ('a, 'b) either = Left of 'a | Right of 'b | ||
|- | |- | ||
| Pattern matching | | Pattern matching | ||
Line 79: | Line 79: | ||
C a b -> ... | C a b -> ... | ||
case | case Left () of | ||
Left x -> x | |||
Right x -> x | |||
| | | | ||
match x with | match x with | ||
B x when x > 0 -> ... | B x when x > 0 -> ... | ||
<nowiki>| B x -> ... | |||
|</nowiki> C (a, b) -> ... | |||
match | match Left () with | ||
Left x <nowiki>|</nowiki> Right x -> x | |||
| | | | ||
|} | |} |
Latest revision as of 16:34, 15 May 2023
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
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
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 |