F#でbegin/endを使う

このエントリはF# Advent Calendar jp 2010の第5回のものです。

F# Advent Calendarって?

  • クリスマスまで一人一個づつF#にまつわる何かをブログに書いていくお祭り。
  • F#に関係してるなら、なんでもいいらしいので、みんな参加してね! →参加登録

begin/end

さて、F#では丸括弧の代わりにbegin/endが使えます。

とりあえず、対話環境(fsi)で試してみましょう。

(* (1 + 2) * 3 と同じ意味 *)
> begin 1 + 2 end * 3;;val it : int = 9

丸括弧のかわりに使えるので、当然begin endでunitになります。

(* begin endでunitになる *)
> let x = begin end;;
val x : unit = ()

高階関数との組合せ

一見意味なさげみ見えますが、高階関数と組合せると見た目がクールになります。

{ 1 .. 10 }|> Seq.map begin fun x ->
    let y = x + 1
    let z = y * 2
    z - 5
end

無名関数の中身が長い場合は普通の丸括弧のかわりにbegin/endを使うほうが読みやすくなります。そこはかとなくただようRubyっぽさがステキです。
当然、渡す関数が最後から二番目にないと使えません。

{ 1 .. 10 } |> Seq.fold begin fun x y ->
    x + y
end 0 (* <- ダサい *)

そういう場合は、flipを使って引数の位置を調節します。

(* 引数の順番をいれかえる関数 *)
let flip f x y =  f y x

(* クール!! *)
{ 1 .. 10 } |> flip Seq.fold 0 begin fun x y ->
    x + y
end

まとめ

  • F#では()の代わりにbegin/endが使えます。
  • 高階関数と組合せるとハッピーです。
  • みんなF# Advent Calendarに参加してね!