It's a real big topic but for now let's watch in action basic function declaration
let sum x = function y -> x + y;; (** just a sum function that has next type *) (** val sum : int -> int -> int = <fun> *) How to read such notation
means the type - it's a function
last int before = means return value of function
previous int's means arguments
Let's watch something more complex
Compose function accepts f and g functions and accepts value (x) on which functions should be applied
let compose f g = function x -> f (g x);; Let's take a glance into high order functions (functional)
Take a look
List.map (function n -> n * 2 + 1) [0;1;2;3;4];; (** : int list = [1; 3; 5; 7; 9] *) Recursive functions
let rec sum l = match l with | [] -> 0 (* base case *) | hd :: tl -> hd + sum tl (* inductive case *) ;; val sum : int list -> int = <fun> sum [1;2;3] ;; (* - : int = 6 *) Logically, you can think of the evaluation of a simple recursive function like sum almost as if it were a mathematical equation whose meaning you were unfolding step by step:
sum [1;2;3] = 1 + sum [2;3] = 1 + (2 + sum [3]) = 1 + (2 + (3 + sum [])) = 1 + (2 + (3 + 0)) = 1 + (2 + 3) = 1 + 5 = 6
Top comments (0)