add content from 2010
[lambda.git] / rosetta2.mdwn
1 # More detailed differences between Scheme, OCaml, and Haskell #
2
3
4 The functional programming literature tends to use one of four languages: Scheme, OCaml, Standard ML (SML), or Haskell. With experience, you'll grow comfortable switching between these. At the beginning, though, it can be confusing.
5
6 The easiest translations are between OCaml and SML. These languages are both derived from a common ancestor, ML. For the most part, the differences between them are only superficial. [Here's a translation manual](http://www.mpi-sws.org/~rossberg/sml-vs-ocaml.html). [Here's another comparison](http://adam.chlipala.net/mlcomp/).
7
8 In some respects these languages are closer to Scheme than to Haskell: Scheme, OCaml and SML all default to call-by-value evaluation order, and all three have native syntax for mutation and other imperative idioms (though that's not central to their design). Haskell is different in both respects: the default evaluation order is call-by-name (strictly speaking, it's "call-by-need", which is a more efficient cousin), and the only way to have mutation or the like is through the use of monads.
9
10 On both sides, however, the non-default evaluation order can also be had by using special syntax. And in other respects, OCaml and SML are more like Haskell than they are like Scheme. For example, OCaml and SML and Haskell all permit you to declare types and those types are *statically checked*: that is, your program won't even start to be interpreted unless all the types are consistent. In Scheme, on the other hand, type-checking only happens when your program is running, and the language is generally much laxer about what it accepts as well typed. (There's no problem having a list of mixed numbers and booleans, for example... and you don't need to wrap them in any sum type to do so.)
11
12 Additionally, the syntax of OCaml and SML is superficially much closer to Haskell's than to Scheme's.
13
14 # Comments, Whitespace, and Brackets #
15
16                 -- this is a single line comment in Haskell
17
18                 {- this
19                    is a multiline
20                    comment in Haskell -}
21
22                 (* this is a single or multiline
23                    comment in OCaml *)
24
25                 ; this is a single line comment in Scheme
26
27                 #| this is a
28                    multiline comment
29                    in Scheme |#
30
31                 #;(this is
32                     (another way to
33                       (comment out (a block) (of Scheme code))))
34
35 *       Haskell is sensitive to linespace and indentation: it matters how your code is lined up. OCaml and Scheme don't care about this, though they recommend following some conventions for readability.
36
37 *       In Haskell, a block of code can be bracketed with `{` and `}`, with different expressions separated by `;`. But usually one would use line-breaks and proper indentation instead. In OCaml, separating expressions with `;` has a different meaning, having to do with how side-effects are sequenced. Instead, one can bracket a block of code with `(` and `)` or with `begin` and `end`. In Scheme, of course, every parentheses is significant.
38
39
40 We've written some advice on how to do some OCaml-ish and Haskell-ish things in Scheme, and how to get Scheme-ish continuations in OCaml, [[on another page|/rosetta3]].
41
42
43
44 #Haskell and OCaml#
45
46 Here we will give some general advice about how to translate between OCaml and Haskell.
47
48 <!--
49 TODO
50 Here is comparison of the syntax for declaring types in Haskell and OCaml:
51
52     -- Haskell
53     data Pretty a b = Lovely a | Cute b ClothingModule.ButtonType
54     newtype Pretty a b = Pretty a b Int
55     newtype Pretty a b = Pretty { unPretty a }
56     type Pretty a b = (a, b)
57
58     (* OCaml *)
59     type ('a,'b) pretty = Lovely of 'a | Cute of 'b * ClothingModule.ButtonType
60     type ('a,'b) pretty = Pretty of 'a * 'b * int
61     type ('a,'b) pretty = Pretty of 'a
62     type ('a,'b) pretty = 'a * 'b
63
64 -->
65
66 *   Our [[more entry-level page|/rosetta1]] comparing Scheme, OCaml, and Haskell (no discussion of types or records)
67 *   It may sometimes be useful to try [OCaml](http://try.ocamlpro.com/) or [Haskell](http://tryhaskell.org/) in your web browser
68 *   See our pages about [[learning OCaml]] and [[learning Haskell]]
69 *   Another page comparing Haskell and OCaml: [Haskell for OCaml Programmers](http://blog.ezyang.com/2010/10/ocaml-for-haskellers/)
70 *   Here's the other direction: [Introduction to OCaml for Haskellers](http://foswiki.cs.uu.nl/foswiki/pub/Stc/BeyondFunctionalProgrammingInHaskell:AnIntroductionToOCaml/ocaml.pdf), [another](http://blog.ezyang.com/2010/10/ocaml-for-haskellers/)
71 *   Haskell Wiki on [OCaml](https://wiki.haskell.org/OCaml)
72 *   [ML Dialects and Haskell](http://hyperpolyglot.org/ml); this discusses other ML-ish languages as well as OCaml and Haskell
73 *   Quora discussion of the [differences between Haskell and ML languages](http://www.quora.com/What-are-the-key-differences-between-Haskell-and-Standard-ML?browse)
74 *   [Another discussion](http://jxyzabc.blogspot.com/2009/03/haskell-vs-ocaml-or-ravings-of.html)
75
76
77 <!--
78 TODO
79 *       There are many Haskell tutorials and textbooks available. This is probably the most actively developed: [Haskell wikibook](http://en.wikibooks.org/wiki/Haskell)
80 *       [Yet Another Haskell Tutorial](http://www.cs.utah.edu/~hal/docs/daume02yaht.pdf) (much of this excellent book has supposedly been integrated into the Haskell wikibook)
81 *       All About Monads has supposedly also been integrated into the Haskell wikibook
82 *       (A not-so-)[Gentle Introduction to Haskell](http://web.archive.org/web/http://www.haskell.org/tutorial/) (archived)
83 *       [Learn You a Haskell for Great Good](http://learnyouahaskell.com/)
84 -->
85
86
87 ##Type expressions##
88
89 *       In Haskell, you say a value has a certain type with: `value :: type`. You express the operation of prepending a new `int` to a list of `int`s with `1 : other_numbers`. In OCaml it's the reverse: you say `value : type` and `1 :: other_numbers`.
90
91 *       In Haskell, type names and constructors both begin with capital letters, and type variables always appear after their constructors, in Curried form. And the primary term for declaring a new type is `data` (short for [[!wikipedia algebraic data type]]). So we have:
92
93                 data Either a b = Left a | Right b;
94                 data FooType a b = Foo_constructor1 a b | Foo_constructor2 a b;
95
96         In printed media, Haskell type variables are often written using Greek letters, like this:
97
98         <pre><code>type Either &alpha; &beta; = Left &alpha; | Right &beta;
99         </code></pre>
100
101         Some terminology: in this type declaration, `Either` is known as a *type-constructor*, since it takes some types <code>&alpha;</code> and <code>&beta;</code> as arguments and yields a new type. We call <code>Left &alpha;</code> one of the *variants* for the type <code>Either &alpha; &beta;</code>. `Left` and `Right` are known as *value constructors* or *data constructors* or just *constructors*. You can use `Left` in any context where you need a function, for example:
102
103                 map Left [1, 2]
104
105         In OCaml, value constructors are still capitalized, but type names are lowercase. Type variables take the form `'a` instead of `a`, and if there are multiple type variables, they're not Curried but instead have to be grouped in a tuple. The syntax for whether they appear first or second is also somewhat different. So we have instead:
106
107                 type ('a,'b) either = Left of 'a | Right of 'b;;
108                 type ('a,'b) foo_type = Foo_constructor1 of 'a * 'b | Foo_constructor2 of 'a * 'b;;
109
110         In OCaml, constructors aren't full-fledged functions, so you need to do this instead:
111
112                 List.map (fun x -> Left x) [1; 2]
113
114         Apart from these differences, there are many similarities between Haskell's and OCaml's use of constructors. For example, in both languages you can do:
115
116                 let Left x = Left 1 in x + 1
117
118 *       In addition to the `data` keyword, Haskell also sometimes uses `type` and `newtype` to declare types. `type` is used just to introduce synonyms. If you say:
119
120                 type Weight = Integer
121                 type Person = (Name, Address)    -- supposing types Name and Address to be declared elsewhere
122
123         then you can use a value of type `Integer` wherever a `Weight` is expected, and vice versa. <!-- `type` is allowed to be parameterized -->
124
125         `newtype` and `data` on the other hand, create genuinely new types. `newtype` is basically just an efficient version of `data` that you can use in special circumstances. `newtype` must always take one type argument and have one value constructor. For example:
126
127                 newtype PersonalData a = PD a
128
129         You could also say:
130
131                 data PersonalData2 a = PD2 a
132
133         And `data` also allows multiple type arguments, and multiple variants and value constructors. <!-- Subtle difference: whereas `PersonalData a` is isomorphic to `a`, `PersonalData2 a` has an additional value, namely `PD2 _|_`. In a strict language, this is an additional type an expression can have, but it would not be a value. -->
134
135         OCaml just uses the one keyword `type` for all of these purposes:
136
137                 type weight = int;;
138                 type person = name * address;;
139                 type 'a personal_data = PD of 'a;;
140
141 *       When a type only has a single variant, as with PersonalData, Haskell programmers will often use the same name for both the type and the value constructor, like this:
142
143                 data PersonalData3 a = PersonalData3 a
144
145         The interpreter can always tell from the context when you're using the type name and when you're using the value constructor.
146
147 *       The type constructors discussed above took simple types as arguments. In Haskell, types are also allowed to take *type constructors* as arguments:
148
149                 data BarType t = Bint (t Integer) | Bstring (t string)
150
151         One does this for example when defining monad transformers---the type constructor `ReaderT` takes some base monad's type constructor as an argument.
152
153         The way to do this this in OCaml is less straightforward. [See here](/code/tree_monadize.ml) for an example.
154
155 *       Haskell has a notion of *type-classes*. They look like this:
156
157                 class Eq a where
158                   (==)    :: a -> a -> Bool
159
160         This declares the type-class `Eq`; in order to belong to this class, a type `a` will have to supply its own implementation of the function `==`, with the type `a -> a -> Bool`. Here is how the `Integer` class signs up to join this type-class:
161
162                 instance Eq Integer where
163                   x == y  =  ... some definition for the Integer-specific version of that function here ...
164
165         Type expressions can be conditional on some of their parameters belonging to certain type-classes. For example:
166
167                 elem      :: (Eq a) => a -> [a] -> Bool
168
169         says that the function `elem` is only defined over types `a` that belong to the type-class `Eq`. For such types `a`, `elem` has the type `a -> [a] -> Bool`.
170
171         Similarly:
172
173                 instance (Eq a) => Eq (Tree a) where
174                   Leaf a         == Leaf b          =  a == b
175                   (Branch l1 r1) == (Branch l2 r2)  =  (l1==l2) && (r1==r2)
176                   _              == _               =  False
177
178         says that if `a` belongs to the typeclass `Eq`, then so too does `Tree a`, and in such cases here is the implementation of `==` for `Tree a`...
179
180 *       OCaml doesn't have type-classes. You can do something similar with OCaml modules that take are parameterized on other modules. Again, [see here](/code/tree_monadize.ml) for an example.
181
182
183 *       Some specific differences in how certain types are expressed. This block in Haskell:
184
185                 Prelude> type Maybe a = Nothing | Just a
186                 Prelude> let x = [] :: [Int]
187                 Prelude> :t x
188                 x :: [Int]
189                 Prelude> let x = () :: ()
190                 Prelude> let x = (1, True) :: (Int, Bool)
191
192         corresponds to this block in OCaml:
193
194                 # type 'a option = None | Some of 'a;;
195                 type 'a option = None | Some of 'a
196                 # let (x : int list) = [];;
197                 val x : int list = []
198                 # let (x : unit) = ();;
199                 val x : unit = ()
200                 # let (x : int * bool) = (1, true);;
201                 val x : int * bool = (1, true)
202
203 *       Haskell has a plethora of numerical types, including the two types `Int` (integers limited to a machine-dependent range) and `Integer` (unbounded integers). The same arithmetic operators (`+` and so on) work for all of these. OCaml also has several different numerical types (though not as many). In OCaml, by default, one has to use a different numerical operator for each type:
204
205                 # 1 + 2;;
206                 - : int = 3
207                 # 1.0 + 2.0;;
208                 Error: This expression has type float but an expression was expected of type int
209                 # 1.0 +. 2.0;;
210                 - : float = 3.
211
212         However the comparison operators are polymorphic. You can equally say:
213
214                 # 1 = 2;;
215                 - : bool = false
216                 # 1.0 = 2.0;;
217                 - : bool = false
218                 # 2 > 1;;
219                 - : bool = true
220                 # 2.0 > 1.0;;
221                 - : bool = true
222
223         But you must still apply these operators to expressions of the same type:
224
225                 # 2.0 > 1;;
226                 Error: This expression has type int but an expression was expected of type float
227
228 * We'll discuss differences between Haskell's and OCaml's record types below.
229
230
231 ##Lists, Tuples, Unit, Booleans##
232
233 *       As noted above, Haskell describes the type of a list of `Int`s as `[Int]`. OCaml describes it as `int list`. Haskell describes the type of a pair of `Int`s as `(Int, Int)`. OCaml describes it as `int * int`. Finally, Haskell uses `()` to express both the unit type and a value of that type. In OCaml, one uses `()` for the value and `unit` for the type.
234
235 *       Haskell describes the boolean type as `Bool` and its variants are `True` and `False`. OCaml describes the type as `bool` and its variants are `true` and `false`. This is an inconsistency in OCaml: other value constructors must always be capitalized.
236
237 *       As noted above, in Haskell one builds up a list by saying `1 : [2, 3]`. In OCaml one says `1 :: [2; 3]`. In Haskell, one can test whether a list is empty with either:
238
239                 lst == []
240                 null lst
241
242         In OCaml, there is no predefined `null` or `isempty` function. One can still test whether a list is empty using the comparison `lst = []`.
243
244 *       In Haskell, the expression `[1..5]` is the same as `[1,2,3,4,5]`, and the expression `[0..]` is a infinite lazily-evaluated stream of the natural numbers. In OCaml, there is no `[1..5]` shortcut, lists must be finite, and they are eagerly evaluated. It is possible to create lazy streams in OCaml, even infinite ones, but you have to use other techniques than the native list type.
245
246 *       Haskell has *list comprehensions*:
247
248                 [ x * x | x <- [1..10], odd x]
249
250         In OCaml, one has to write this out longhand:
251
252                 List.map (fun x -> x * x) (List.filter odd [1..10]);;
253
254 *       In Haskell, the expressions `"abc"` and `['a','b','c']` are equivalent. (Strings are just lists of `char`s.) In OCaml, these expressions have two different types.
255
256         Haskell uses the operator `++` for appending both strings and lists (since Haskell strings are just one kind of list). OCaml uses different operators:
257
258                 # "string1" ^ "string2";;
259                 - : string = "string1string2"
260                 # ['s';'t'] @ ['r';'i';'n';'g'];;
261                 - : char list = ['s'; 't'; 'r'; 'i'; 'n'; 'g']
262                 # (* or equivalently *)
263                   List.append ['s';'t'] ['r';'i';'n';'g'];;
264                 - : char list = ['s'; 't'; 'r'; 'i'; 'n'; 'g']
265
266
267 ##Let and Where##
268
269 *       Haskell permits both:
270
271                 foo x =
272                   let result1 = x * x
273                       result2 = x + 1
274                   in result1 + result2
275
276         and:
277
278                 foo x = result1 + result2
279                   where result1 = x * x
280                         result2 = x + 1
281
282         OCaml permits only:
283
284                 let foo x =
285                   let result1 = x * x
286                   in let result2 = x + 1
287                   in result1 + result2;;
288
289 ##Patterns##
290
291 *       In OCaml:
292
293                 # let (x, y) as both = (1, 2)
294                   in (both, x, y);;
295                 - : (int * int) * int * int = ((1, 2), 1, 2)
296
297
298         The same in Haskell:
299
300                 let both@(x,y) = (1, 2)
301                   in (both, x, y)
302
303 *       In OCaml:
304
305                 match list_expression with
306                   | y::_ when odd y -> result1
307                   | y::_ when y > 5 -> result2
308                   | y::_ as whole -> (whole, y)
309                   | [] -> result4
310
311         The same in Haskell:
312
313                 case list_expression of
314                   (y:_) | odd y -> result1
315                         | y > 5 -> result2
316                   whole@(y:_) -> (whole, y)
317                   [] -> result4
318
319
320 ##Records##
321
322 Haskell and OCaml both have `records`, which are essentially just tuples with a pretty interface. We introduced these in the wiki notes [here](/coroutines_and_aborts/).
323
324 The syntax for declaring and using these is a little bit different in the two languages.
325
326 *       In Haskell one says:
327
328                 -- declare a record type
329                 data Color = Col { red, green, blue :: Int }
330                 -- create a value of that type
331                 let c = Col { red = 0, green = 127, blue = 255 }
332
333         In OCaml one says instead:
334
335                 type color = { red : int; green : int; blue : int };;
336                 let c = { red = 0; green = 127; blue = 255 }
337
338         Notice that OCaml doesn't use any value constructor `Col`. The record syntax `{ red = ...; green = ...; blue = ... }` is by itself the constructor. The record labels `red`, `green`, and `blue` cannot be re-used for any other record type.
339
340 *       In Haskell, one may have multiple constructors for a single record type, and one may re-use record labels within that type, so long as the labels go with fields of the same type:
341
342                 data FooType = Constructor1 {f :: Int, g :: Float} | Constructor2 {f :: Int, h :: Bool}
343
344 *       In Haskell, one can extract a single field of a record like this:
345
346                 let c = Col { red = 0, green = 127, blue = 255 }
347                 in red c    -- evaluates to 0
348
349         In OCaml one says:
350
351                 let c = { red = 0; green = 127; blue = 255 }
352                 in c.red    (* evaluates to 0 *)
353
354 *       In both languages, there is a special syntax for creating a copy of an existing record, with some specified fields altered. In Haskell:
355
356                 let c2 = c { green = 50, blue = 50 }
357                 -- evaluates to Col { red = red c, green = 50, blue = 50 }
358
359         In OCaml:
360
361                 let c2 = { c with green = 50; blue = 50 }
362                 (* evaluates to { red = c.red; green = 50; blue = 50 }
363
364 *       One pattern matches on records in similar ways. In Haskell:
365
366                 let Col { red = r, green = g } = c
367                 in r
368
369         In OCaml:
370
371                 let { red = r; green = g; _ } = c
372                 in r
373
374         In Haskell:
375
376                 makegray c@(Col { red = r } ) = c { green = r, blue = r }
377
378         is equivalent to:
379
380                 makegray c = let Col { red = r } = c
381                              in { red = r, green = r, blue = r }
382
383         In OCaml it's:
384
385                 # let makegray ({ red = r; _ } as c) = { c with green=r; blue=r };;
386                 val makegray : color -> color = <fun>
387                 # makegray { red = 0; green = 127; blue = 255 };;
388                 - : color = {red = 0; green = 0; blue = 0}
389
390 *       Records just give your types a pretty interface; they're entirely dispensable. Instead of:
391
392                 type color = { red : int; green : int; blue : int };;
393                 let c = { red = 0; green = 127; blue = 255 };;
394                 let r = c.red;;
395
396         You could instead just use a more familiar data constructor:
397
398                 type color = Color of (int * int * int);;
399                 let c = Color (0, 127, 255);;
400         
401         and then extract the field you want using pattern-matching:
402
403                 let Color (r, _, _) = c;;
404                 (* or *)
405                 match c with Color (r, _, _) -> ...
406
407         (Or you could just use bare tuples, without the `Color` data constructor.)
408
409         The record syntax only exists because programmers sometimes find it more convenient to say:
410
411                 ... c.red ...
412
413         than to reach for those pattern-matching constructions.
414
415
416
417 ##Functions##
418
419 *       In Haskell functions are assumed to be recursive, and their types and applications to values matching different patterns are each declared on different lines. So we have:
420
421                 factorial    :: int -> int
422                 factorial 0  =  1
423                 factorial n  =  n * factorial (n-1)
424
425         In OCaml you must explicitly say when a function is recursive; and this would be written instead as:
426
427                 let rec factorial (n : int) : int =
428                   match n with
429                     | 0 -> 1
430                     | x -> x * factorial (x-1)
431
432         or:
433
434                 let rec factorial : int -> int =
435                   fun n -> match n with
436                     | 0 -> 1
437                     | x -> x * factorial (x-1)
438
439         or (though we recommend not using this last form):
440
441                 let rec factorial : int -> int =
442                   function
443                     | 0 -> 1
444                     | x -> x * factorial (x-1)
445
446 *       Another example, in Haskell:
447
448                 length         :: [a] -> Integer
449                 length []      =  0
450                 length (x:xs)  =  1 + length xs
451
452         In OCaml:
453
454                 let rec length : 'a list -> int =
455                   fun lst -> match lst with
456                     | [] -> 0
457                     | x::xs -> 1 + length xs
458
459 *       Another example, in Haskell:
460
461                 sign x | x >  0      = 1
462                        | x == 0      = 0
463                        | otherwise   = -1
464
465         In OCaml:
466
467                 let sign x = match x with
468                   | x' when x' > 0 -> 1
469                   | x' when x' = 0 -> 0
470                   | _ -> -1
471
472 *       In Haskell the equality comparison operator is `==`, and the non-equality operator is `/=`. In OCaml, `==` expresses "physical identity", which has no analogue in Haskell because Haskell has no mutable types. See our discussion of "Four grades of mutation involvement" in the [[Week9]] notes. In OCaml the operator corresponding to Haskell's `==` is just `=`, and the corresponding non-equality operator is `<>`.
473
474 *       In both Haskell and OCaml, one can use many infix operators as prefix functions by parenthesizing them. So for instance:
475
476                 (+) 1 2
477
478         will work in both languages. One notable exception is that in OCaml you can't do this with the list constructor `::`:
479
480                 # (::) 1 [1;2];;
481                 Error: Syntax error
482                 # (fun x xs -> x :: xs) 1 [1; 2];;
483                 - : int list = [1; 1; 2]
484
485 *       Haskell also permits two further shortcuts here that OCaml has no analogue for. In Haskell, in addition to writing:
486
487                 (>) 2 1
488
489         you can also write either of:
490
491                 (2 >) 1
492                 (> 1) 2
493
494         In OCaml one has to write these out longhand:
495
496                 (fun y -> 2 > y) 1;;
497                 (fun x -> x > 1) 2;;
498
499         Also, in Haskell, there's a special syntax for using what are ordinarily prefix functions as infix operators:
500
501                 Prelude> elem 1 [1, 2]
502                 True
503                 Prelude> 1 `elem` [1, 2]
504                 True
505
506         In OCaml one can't do that. There's only:
507
508                 # List.mem 1 [1; 2];;
509                 - : bool = true
510
511 *       In Haskell one writes anonymous functions like this:
512
513                 \x -> x + 1
514
515         In OCaml it's:
516
517                 fun x -> x + 1
518
519 *       Haskell uses the period `.` as a composition operator:
520
521                 g . f
522                 -- same as
523                 \x -> g (f x)
524
525         In OCaml one has to write it out longhand:
526
527                 fun x -> g (f x)
528
529 *       In Haskell, expressions like this:
530
531                 g $ f x y
532
533         are equivalent to:
534
535                 g (f x y)
536
537         (Think of the period in our notation for the untyped lambda calculus.)
538
539 *       The names of standard functions, and the order in which they take their arguments, may differ. In Haskell:
540
541                 Prelude> :t foldr
542                 foldr :: (a -> b -> b) -> b -> [a] -> b
543
544         In OCaml:
545
546                 # List.fold_right;;
547                 - : ('a -> 'b -> 'b) -> 'a list -> 'b -> 'b = <fun>
548
549 *       Some functions are predefined in Haskell but not in OCaml. Here are OCaml definitions for some common ones:
550
551                 let id x = x;;
552                 let const x _ = x;;
553                 let flip f x y = f y x;;
554                 let curry (f : ('a, 'b) -> 'c) = fun x y -> f (x, y);;
555                 let uncurry (f : 'a -> 'b -> 'c) = fun (x, y) -> f x y;;
556                 let null lst = lst = [];;
557
558         `fst` and `snd` (defined only on pairs) are provided in both languages. Haskell has `head` and `tail` for lists; these will raise an exception if applied to `[]`. In OCaml the corresponding functions are `List.hd` and `List.tl`. Many other Haskell list functions like `length` are available in OCaml as `List.length`, but OCaml's standard libraries are leaner that Haskell's.
559
560 *       The `until` function in Haskell is used like this:
561
562                 until (\l -> length l == 4) (1 : ) []
563                 -- evaluates to [1,1,1,1]
564
565                 until (\x -> x == 10) succ 0
566                 -- evaluates to 10
567
568         This can be defined in OCaml as:
569
570                 let rec until test f z =
571                   if test z then z else until test f (f z)
572
573
574 ##Lazy or Eager##
575
576 *       As we've mentioned several times, Haskell's evaluation is by default *lazy* or "call-by-need" (that's an efficient version of "call-by-name" that avoids computing the same results again and again). In some places Haskell will force evaluation to be *eager* or "strict". This is done in several different ways; the symbols `!` and `seq` are signs that it's being used.
577
578 *       Like Scheme and most other languages, OCaml is by default eager. Laziness can be achieved either by using thunks:
579
580                 # let eval_later1 () = 2 / 2;;
581                 val eval_later1 : unit -> int = <fun>
582                 # let eval_later2 () = 2 / 0;;
583                 val eval_later2 : unit -> int = <fun>
584                 # eval_later1 ();;
585                 - : int = 1
586                 # eval_later2 ();;
587                 Exception: Division_by_zero.
588
589         or by using the special forms `lazy` and `Lazy.force`:
590
591                 # let eval_later3 = lazy (2 / 2);;
592                 val eval_later3 : int lazy_t = <lazy>
593                 # Lazy.force eval_later3;;
594                 - : int = 1
595                 # eval_later3;;
596                 - : int lazy_t = lazy 1
597
598         Notice in the last line the value is reported as being `lazy 1` instead of `<lazy>`. Since the value has once been forced, it won't ever need to be recomputed. The thunks are less efficient in this respect. Even though OCaml will now remember what `eval_later3` should be forced to, `eval_later3` is still type-distinct from a plain `int`.
599
600
601 ##Monads##
602
603 Haskell has more built-in support for monads, but one can define the monads one needs in OCaml.
604
605 *       In our seminar, we've been calling one monadic operation `unit`; in Haskell the same operation is called `return`. We've been calling another monadic operation `bind`, used in prefix form, like this:
606
607                 bind u f
608
609         In Haskell, one uses the infix operator `>>=` to express bind instead:
610
611                 u >>= f
612
613         If you like this Haskell convention, you can define `>>=` in OCaml like this:
614
615                 let (>>=) = bind;;
616
617 *       Haskell also uses the operator `>>`, where `u >> v` means the same as `u >>= \_ -> v`.
618
619 *       In Haskell, one can generally just use plain `return` and `>>=` and the interpreter will infer what monad you must be talking about from the surrounding type constraints. In OCaml, you generally need to be specific about which monad you're using. So in these notes, when mutiple monads are on the table, we've defined operations as `reader_unit` and `reader_bind`, and so on.
620
621 *       Haskell has a special syntax for working conveniently with monads. It looks like this. Assume `u` `v` and `w` are values of some monadic type `M a`. Then `x` `y` and `z` will be variables of type `a`:
622
623                 do
624                   x <- u
625                   y <- v
626                   w
627                   let z = foo x y
628                   return z
629
630         This is equivalent in meaning to the following:
631
632                 u >>= \ x ->
633                 v >>= \ y ->
634                 w >>= \ _ ->
635                 let z = foo x y
636                 in return z
637
638         which can be translated straightforwardly into OCaml.
639
640         For more details, see:
641
642         *       [Haskell wikibook on do-notation](http://en.wikibooks.org/wiki/Haskell/do_Notation)
643         *       [Yet Another Haskell Tutorial on do-notation](http://en.wikibooks.org/wiki/Haskell/YAHT/Monads#Do_Notation)
644         *       [Do-notation considered harmful](http://www.haskell.org/haskellwiki/Do_notation_considered_harmful)
645
646 *       If you like the Haskell do-notation, there's [a library](http://www.cas.mcmaster.ca/~carette/pa_monad/) you can compile and install to let you use something similar in OCaml.
647
648 *       In order to do any printing, Haskell has to use a special `IO` monad. So programs will look like this:
649
650                 main :: IO ()
651                 main = do
652                   let s = "hello world"
653                   putStrLn s
654         
655                 main :: IO String
656                 main = do
657                   let s = "hello world"
658                   putStrLn s
659                   return s
660         
661                 main :: IO String
662                 main = let s = "hello world"
663                        in putStrLn s >> return s
664
665         OCaml permits you to mix side-effects with regular code, so you can just print, without needing to bring in any monad:
666
667                 let main =
668                   let s = "hello world"
669                   in let () = print_endline s
670                   in s;;
671
672         or:
673
674                 let main =
675                   let s = "hello world"
676                   in print_endline s ; s;;
677