Tuesday, July 13, 2010

F# samples

// Learn more about F# at http://fsharp.net^
let data = [7; 31; 2; 3; 14; 5; 1009; 56; 9090];

let rec sort ax =
    if ax = [] then [] else

        let pivot = List.head ax
        let left = [for v in List.tail ax do if v < pivot then yield v]
        let right = [for v in List.tail ax do if v > pivot then yield v]
        sort left @ [pivot] @ sort right

printfn "%A" (sort data)

let rec sort2 cmp ax  =
    if ax = [] then [] else

        let pivot = List.head ax
        let left = [for v in List.tail ax do if cmp v pivot then yield v]
        let right = [for v in List.tail ax do if cmp pivot v then yield v]
        sort2 cmp left  @ [pivot] @ sort2 cmp right
   
printfn "%A" (sort2  (>) data)
printfn "%A" (sort2  (<) data)

let sort_asc ax = sort2 (>) ax
let sort_desc ax = sort2(<) ax

printfn "%A" (sort_asc  data)
printfn "%A" (sort_desc data)


let filter_large z = List.filter (fun x -> x > z)

printfn "%A" (filter_large 1000 data)



//let data = [1; 2; 3; 4; 5]

let pr_int x = printfn "%d" x


let data2 = [for i in [0..500000] -> i]

// bad impl
let rec sum list =
    match list with
    | [] -> 0
    | x::xs -> x + (sum xs)


// good impl
let sum2 list =
    let rec sum list a =
        match list with
        | [] -> a
        | x::xs -> sum xs (a + x)
    sum list 0

//pr_int (sum data2)
pr_int (sum2 data2)


//let rec infinite_loop x = infinite_loop (x + 10)
//pr_int (infinite_loop 10)

let mul2 list =
    let rec mul list a =
        match list with
        | [] -> a
        | x::xs -> mul xs (a * x)
    mul list 1

pr_int (mul2 data)

let rec process_list op acc list =
    match list with
    | [] -> acc
    | x::xs -> process_list op (op acc x) xs
   
pr_int (process_list (*) 1 data)

let mul3 = process_list (*) 1

pr_int (mul3 data)

let mul4 = List.fold (*) 1

pr_int (mul4 data)