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に参加してね!