リスト (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()