OCaml
From HaskellWiki
(Difference between revisions)
(→Conceptual differences) |
(→Syntactic dictionary) |
||
| (12 intermediate revisions not shown.) | |||
| Line 2: | Line 2: | ||
This page aims to cover some of its differences from Haskell. | 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 <tt>let</tt> is non-recursive by default, but has the form <tt>let rec</tt> 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 == | == Syntactic dictionary == | ||
{| class="wikitable" | {| class="wikitable" | ||
| - | | | + | | |
| - | | Haskell | + | | '''Haskell''' |
| - | | OCaml | + | | '''OCaml''' |
| - | | Comments | + | | '''Comments''' |
|- | |- | ||
| Anonymous functions | | Anonymous functions | ||
| Line 57: | 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 | ||
| | | | ||
case x of | case x of | ||
| - | + | B x | |
| + | <nowiki>| x > 0 -> ... | ||
| + | |</nowiki> otherwise -> ... | ||
C a b -> ... | C a b -> ... | ||
| + | |||
| + | case Left () of | ||
| + | Left x -> x | ||
| + | Right x -> x | ||
| | | | ||
match x with | match x with | ||
| - | + | B x when x > 0 -> ... | |
| - | C (a, b) -> ... | + | <nowiki>| B x -> ... |
| + | |</nowiki> C (a, b) -> ... | ||
| + | |||
| + | match Left () with | ||
| + | Left x <nowiki>|</nowiki> Right x -> x | ||
| + | | | ||
|} | |} | ||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
Current revision
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.
1 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.
2 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 a double type |
| Type signatures |
const :: a -> b -> a |
const : 'a -> 'b -> 'a | Signatures usually omitted in OCaml |
| 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 |
