Project Euler 1(2)

sumを再帰的に定義しましょう。

let sum list =
    match list with
        | head :: tail -> head + sum tail
        | [] -> 0

let N = 1000;
printfn "%d" (sum (List.filter (fun n -> n % 3 = 0 || n % 5 = 0) [1..N-1]))

最後の行、filterはこのように使います。
ラムダは次のように書きます。

fun n -> n % 3 = 0 || n % 5 = 0

そして、[1..N-1]は1からN-1のリストです。
sumの定義の中身はHaskellと似てますね。
さて、上をコンパイルすると、

error FS0039: The value or constructor 'sum' is not defined

どうやら再帰的に関数を定義したいときはrecを使わないといけないようです。

let rec sum list =

よく見ると、ちゃんとfoldもありました。

let rec sum list = List.fold (+) 0 list

実際には、List.sumを使えばよいです。

let N = 1000;
printfn "%d" (List.sum (List.filter
        (fun n -> n % 3 = 0 || n % 5 = 0) [1..N-1]))