Skip to content

Instantly share code, notes, and snippets.

@keigoi
Created September 28, 2016 07:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save keigoi/ff163e3f44593431c6e30b858097269f to your computer and use it in GitHub Desktop.
Save keigoi/ff163e3f44593431c6e30b858097269f to your computer and use it in GitHub Desktop.
let rec fib n =
if n <= 1 then
1
else
let x = fib (n-1)
and y = fib (n-2)
in x+y
let main n = print_int (fib n)
module Main1 = struct
type 'a t = 'a
let (>>=) m f = match m with
| x -> f x
let return x = x
let run = function
| x -> x
let rec fib1 n =
if n <= 1 then
return 1
else
fib1 (n-1) >>= fun x ->
fib1 (n-2) >>= fun y ->
return (x+y)
let main n = print_int (run (fib1 n))
end
module Main1_ = struct
type 'a t = [`Some of 'a]
let (>>=) m f = match m with
| `Some x -> f x
let return x = `Some(x)
let run = function
| `Some x -> x
let rec fib1_ n =
if n <= 1 then
return 1
else
fib1_ (n-1) >>= fun x ->
fib1_ (n-2) >>= fun y ->
return (x+y)
let main n = print_int (run (fib1_ n))
end
module Main2 = struct
type 'a t = Some of 'a | None
let (>>=) m f = match m with
| Some x -> f x
| None -> None
let return x = Some(x)
let run = function
| Some x -> x
| None -> failwith "None."
let rec fib2 n =
if n <= 1 then
return 1
else
fib2 (n-1) >>= fun x ->
fib2 (n-2) >>= fun y ->
return (x+y)
let main n = print_int (run (fib2 n))
end
module Main2_ = struct
type 'a t = Some of 'a | None of 'a
let (>>=) m f = match m with
| Some x -> f x
| None x -> None x
let return x = Some(x)
let run = function
| Some x -> x
| None _ -> failwith "None."
let rec fib2_ n =
if n <= 1 then
return 1
else
fib2_ (n-1) >>= fun x ->
fib2_ (n-2) >>= fun y ->
return (x+y)
let main n = print_int (run (fib2_ n))
end
module Main3 = struct
type 'a t = Some of 'a | None | None2 | None3 | None4
let (>>=) m f = match m with
| Some x -> f x
| None -> None
let return x = Some(x)
let run = function
| Some x -> x
| _ -> failwith "fail."
let rec fib3 n =
if n <= 1 then
return 1
else
fib3 (n-1) >>= fun x ->
fib3 (n-2) >>= fun y ->
return (x+y)
let main n = print_int (run (fib3 n))
end
module Main3_ = struct
type 'a t = [`Some of 'a | `None | `None2 | `None3 | `None4]
let (>>=) m f = match m with
| `Some x -> f x
| `None -> `None
| `None2 -> `None2
| `None3 -> `None3
| `None4 -> `None4
let return x = `Some(x)
let run = function
| `Some x -> x
| _ -> failwith "fail."
let rec fib3_ n =
if n <= 1 then
return 1
else
fib3_ (n-1) >>= fun x ->
fib3_ (n-2) >>= fun y ->
return (x+y)
let main n = print_int (run (fib3_ n))
end
let _ =
if Sys.argv.(1)="--orig" then begin
print_endline "--orig";
main (int_of_string (Sys.argv.(2)))
end else if Sys.argv.(1)="--one" then begin
print_endline "--one";
Main1.main (int_of_string (Sys.argv.(2)))
end else if Sys.argv.(1)="--one2" then begin
print_endline "--one2";
Main1_.main (int_of_string (Sys.argv.(2)))
end else if Sys.argv.(1)="--two" then begin
print_endline "--two";
Main2.main (int_of_string (Sys.argv.(2)))
end else if Sys.argv.(1)="--two2" then begin
print_endline "--two2";
Main2_.main (int_of_string (Sys.argv.(2)))
end else if Sys.argv.(1)="--three" then begin
print_endline "--three";
Main3.main (int_of_string (Sys.argv.(2)))
end else if Sys.argv.(1)="--three2" then begin
print_endline "--three2";
Main3_.main (int_of_string (Sys.argv.(2)))
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment