In this sample, I want to show how to use Active Pattern to decompose the data. From the code itself, you can easily find the hint of the data. If you see (l, value, r) which is from a sorted list. Most likely, the l, value, and r are in order. Also the Array slicing is a nice syntax feature as well.
let getMedian (list:float array) =
let len = list.Length
if len % 2 = 0 then
(list.[len/2-1] + list.[len/2]) / 2.
else
list.[len/2]
let (|Median|) (list:float array) =
let median = getMedian list
let len = list.Length
if len % 2 = 0 then
(list.[0..len/2-1], median, list.[len/2..])
else
(list.[0..len/2], median, list.[len/2..])
let rec getMedianFromTwo (list0:float array) (list1:float array) =
match list0, list1 with
| [||], [||] -> 0.
| [|a|], [|b|] -> (a+b) / 2.
| [|a0; a1|], [|b0; b1|] -> ((max a0 b0) + (min a1 b1)) / 2.
| Median(l0, m0, r0), Median(l1, m1, r1) ->
if m0 = m1 then
m0
elif m0 < m1 then
getMedianFromTwo r0 l1
else //m0 > m1
getMedianFromTwo l0 r1
let list0 = [|1.;4.;7.;8.;9.;10.|]
let list1 = [|2.;4.;6.;7.;9.;15.|]
let c = getMedianFromTwo list0 list1