http://projecteuler.net/index.php?section=problems&id=2

Imperative style of coding is mostly not too elegant, but sometimes, not necessarily here, clearer and faster:
let problem2 =
    let mutable a, b, sum = 0, 1, 0
    while a+b <= 4000000 do
        b <- a+b
        a <- b-a
        if b%2 = 0 then sum <- sum + b
    sum ;;
Functional style is to first get a infinite Fibonacci sequence. Everytime Seq.takeWhile needs an element from fibSeq Seq.unfold creates (the next) one. Then we simply use Seq.sumBy.
let problem2 =
    let fibSeq = (1,1) |> Seq.unfold (fun (a, b) -> Some(a+b, (b, a+b)) )
    fibSeq
    |> Seq.takeWhile (fun x -> x <= 4000000)
    |> Seq.sumBy (fun x -> if x%2 = 0 then x else 0) ;;
With Seq.unfold it is also possible to generate a finite sequence:
let problem2 =
    let fibSeq =
        (1,1)
        |> Seq.unfold (fun (a,b) -> if a+b <= 4000000 then Some(a+b, (b, a+b)) else None)
    fibSeq
    |> Seq.sumBy (fun x-> if x%2 = 0 then x else 0) ;;
Also functional style is recursion:
let problem2 =
    let max = 4000000
    let rec p2' (a, b, sum) =
        match a+b with
        | x when x%2 = 0 -> if (x < max) then p2' (b, x, sum+x) else sum
        | x              -> p2' (b, x, sum)
    p2' (0,1,0) ;;