I have written the following program to implement merge sort in F#.Can you please review this and let me know how can I write this in the most functional way (also most efficient and concise)?In my recursion call, mergeSort is called again twice. I think it will be great if these two calls could be made on different threads.Do I have to explicitly create separate threads or will F# automatically detect and execute on different cores (threads)? I have heard that functional languages are more multi-core friendly so I wonder what sort of optimization will be done by F# (or perhaps if this code was written in Haskell or pure functional language).let take n list =     List.ofSeq <| Seq.take n listlet rec takeRest n list =     match (n, list) with    | (0, l) -> l    | (n, _ :: tl) -> takeRest (n - 1) tl    | (_, _) -> failwith unknown patternlet rec mergeList list1 list2 =    match (list1, list2) with    | [], [] -> []    | [], l -> l    | l, [] -> l    | hd1 :: tl1, (hd2 :: _ as tl2) when hd1 < hd2 -> hd1 ::  mergeList tl1 tl2    | l1, hd2 :: tl2 -> hd2 :: mergeList l1 tl2let rec mergeSort = function    | [] -> []     | [x] -> [x]    | l ->         let n = (int)(List.length l / 2)                let list1 = mergeSort (take n l)        let list2 = mergeSort (takeRest n l)        mergeList list1 list2[<EntryPoint>]let main args =     let input = [10; 7; 1; 0; -1; 9; 33; 12; 6; 2; 3; 33; 34;];    List.iter (fun x -> printfn %i x) (mergeSort input)    0
Merge Sort Program
recursion;functional programming;sorting;f#;mergesort