リスト (F#)

関数型言語では特に重要なリスト構造。再帰呼び出しを使って操作するところがミソかな。

(*  リストの定義
    このように :: でつなげて定義
*)
let sample1 = "one" :: "two" :: "three" :: "four" :: []
printfn "%A" sample1
(* カッコを丁寧に付けるとこうなる  *)
let sample2 = "five" :: ("six" :: ("seven" :: ("eight" :: [])))
printfn "%A" sample2
(* 次のように ; 区切りで簡易的に書くことが出来る *)
let sample3 = ["nine"; "ten"; "eleven"; "twelve"]
printfn "%A" sample3
(*  リストの各要素に対して action を適用する関数
    - 引数 action ... リストの各要素に対して適用する関数
    - 引数 ls     ... 操作対象のリスト
*)
let rec foreach action ls =
  match ls with
  | [] -> ()              // 空リストなら何もしない
  | head :: tail ->       // 空でない場合
    action head           // head に対して action 関数を適用
    foreach action tail   // 再帰呼び出し
(* リストの全要素をプリント
   - 上記の foreach 関数を利用 
   - action として要素をプリントする関数を渡す
*)
foreach (fun x -> printf "%s " x) sample1
print_newline()   // 改行
(*  実は foreach と同様の関数は定義済み
    List.iter を使用すればOK
*)
List.iter (fun x -> printf "%s " x) sample2
print_newline()
(* カリー化を利用してリストをプリントする関数を定義 *)
let printList = List.iter (fun x -> printf "%s " x)

printList sample3
print_newline()
(*  for 文も使える
    これは関数型プログラミングっぽくない書き方 *)
for x in sample1 do printf "%s " x
print_newline()