## Computing bound of a List with F#

Following code snippet shows how to compute bound (i.e the min and max elements) of a List using F#.

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
 let rec bound (lst:int list) : (int*int) option = match lst with | [] -> None // Empty List | xhd::xtl -> match bound xtl with | None -> Some (xhd,xhd) // List with only 1 element | Some (x,y) -> Some ((if x>xhd then xhd else x), (if y
view raw bound.fs hosted with ❤ by GitHub

Solution outlined here is quite trivial and use the pattern matching facilities of F#.  In case of an empty list (line 3), it returns `None`; otherwise, it returns the bound as `Some (int*int)`  (line 8).

Therefore, the signature of `bound` is given by-

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
 val bound : lst:int list -> (int * int) option
view raw gistfile1.fs hosted with ❤ by GitHub

Output of `bound`

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
 > bound [1;2;3;4];; val it : (int * int) option = Some (1, 4) > bound [1];; val it : (int * int) option = Some (1, 1) > bound [];; val it : (int * int) option = None
view raw gistfile1.fs hosted with ❤ by GitHub

## F# | Length of a List

The code snippets listed below defines a function to compute the length of a give list using F#. Note that these functions are also called polymorphic function, as they work with any type of list (as shown in the output).

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
 // naive implementation let rec length list = match list with | [] -> 0 | _::tail -> 1 + computeLength tail
view raw gistfile1.fs hosted with ❤ by GitHub

A `tail recursive implementation `is outlined next.

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
 // Tail recursive computation of List's length let length list = // Auxiliary function to compute length // It store intermediate result in acc. let rec lengthAux acc list = match list with | [] -> acc | _::tail -> lengthAux (acc+1) tail lengthAux 0 list // invoking lengthAux with acc = 0
view raw gistfile1.fs hosted with ❤ by GitHub

Following is a more succinct implementation using `List.Fold`.

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
 let length list = List.fold (fun acc _ -> acc+1) 0 list
view raw length.fs hosted with ❤ by GitHub

Output:

```> length [];;
val it : int = 0
> length [1;2;3;4];;
val it : int = 4
> length ['a';'b'];;
val it : int = 2
```