Real World Code Snippet
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
module RealWorld : sig
type world = private World
type α pure = private Pure of α
type α io = world → ( α pure * world )
val bind : α io → β io → β io
val lift : α io → ( α pure → β io ) → β io
val ( >> ) : α io → β io → β io
val ( >>= ) : α io → ( α pure → β io ) → β io
val unit : unit pure
val effect : ( α → β ) → α pure → β io
val eval : unit io → ( unit pure * world )
end
= struct
type world = World
type α pure = Pure of α
type α io = world → ( α pure * world )
let bind : α io → β io → β io =
λ action1 action2 world0 →
let ( a , world1 ) = action1 world0 in
let ( b , world2 ) = action2 world1 in
( b , world2 )
let lift : α io → ( α pure → β io ) → β io =
λ action1 action2 world0 →
let ( a , world1 ) = action1 world0 in
let ( b , world2 ) = action2 a world1 in
( b , world2 )
let ( >> ) : α io → β io → β io = bind
let ( >>= ) : α io → ( α pure → β io ) → β io = lift
let unit : unit pure = Pure ()
let effect : ( α → β ) → α pure → β io =
λ f ( Pure a ) →
λ world → Pure ( f a ) , world
let eval : unit io → ( unit pure * world ) =
λ main → main World
end
Real World Code output:
module RealWorld :
sig
type world = private World
type 'a pure = private Pure of 'a
type 'a io = world -> 'a pure * world
val bind : 'a io -> 'b io -> 'b io
val lift : 'a io -> ('a pure -> 'b io) -> 'b io
val ( >> ) : 'a io -> 'b io -> 'b io
val ( >>= ) : 'a io -> ('a pure -> 'b io) -> 'b io
val unit : unit pure
val effect : ('a -> 'b) -> 'a pure -> 'b io
val eval : unit io -> unit pure * world
end
Utils Code Snippet
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
module Util = struct
open RealWorld
let ( ! ) : α → α io =
λ a → effect ( λ _ → a ) unit
let readLn : string io =
effect read_line unit
let putStr : string pure → unit io =
effect print_string
let putStrLn : string pure → unit io =
effect print_endline
let sample : unit io =
! "What is your name?"
>>= putStrLn
>> readLn
>>= λ a →
! "How old are you?"
>>= putStrLn
>> readLn
>>= λ b →
putStr a
>> ! ": "
>>= putStr
>> putStrLn b
end
Utils Code output:
module Util :
sig
val ( ! ) : 'a -> 'a RealWorld.io
val readLn : string RealWorld.io
val putStr : string RealWorld.pure -> unit RealWorld.io
val putStrLn : string RealWorld.pure -> unit RealWorld.io
val sample : unit RealWorld.io
end
Execution Code Snippet
let _ = Util . sample |> RealWorld . eval
mon@razerRamon:~/tmp/ocaml$ ocaml real_world.ml
Execution Code output:
What is your name?
John Doe
How old are you?
42
John Doe: 42
References:
The Haskell Programming Language, IO inside :