関数とか演算子とか (F#)

(* anonymous function
   いわゆるラムダ式
*)
printfn "1 + 2 = %d" ((fun x y -> x + y) 1 2)
(* function キーワードによるラムダ式
   - function は引数を1つしか持てない
   - 引数を2つ以上使いたいときは次のようにつなげる
   - 普通は function ではなくて fun を使えば OK
*)
printfn "1 + 2 = %d" ((function x -> function y -> x + y) 1 2)

// 丁寧にカッコを付けるとこうなる
printfn "1 + 2 = %d" ((function x -> (function y -> x + y)) 1 2)
(* カリー化 *)
let plus x y = x + y    // 2引数の関数を定義
let increment = plus 1  // カリー化により1引数の関数を生成
printfn "(increment 3) = %d" (increment 3)  // (plus 1 3) と同じ結果
(* 演算子
   S = { !$%&*+-./<=>?@^|~ } とすると S(S|':')* という記号列を
   自由に演算子として定義できる。
   だから次のような顔文字みたいな演算子も定義可能。面白い。
*)
let (@^-^@) he her = he + " loves " + her // 演算子 @^-^@ を定義
printfn "%s" ("Jack" @^-^@ "Nancy") // "Jack loves Nancy" と出力