OCaml

練習問題 5.4 二重のmapをひとつのmapにする

練習問題 5.4

f, g を適当な型の関数とします。map f (map g l) を map を一度しか使用しない同じ意味の式に書き換えなさい。map (fun x -> … ) l の … の部分はどうなるでしょう?

まず、map 関数を定義する。

let rec map g l =
match l with
[] -> []
| v :: rest ->
(g v) :: map g rest;;

g 関数を (fun x -> x * 2) とすると、

let test1 = map (fun x -> x * 2) [1; 2; 3] = [2; 4; 6];;

となる。

また、上記の問題より

f — (fun x -> x * x)
g — (fun x -> x * 2)

とすると、

# map (fun x -> x * x) (map (fun x -> x * 2) [1; 2; 3]);;

は、

– : int list = [4; 16; 36]

となる。

map を一度だけ使う式にすると、

map (fun x -> (x * 2) * (x * 2)) [1; 2; 3];;

となる。

最終的には、以下のように表すことができる。

let f x = x * x;;
let g x = x * 2;;

let test11 = f 3 = 9;;
let test12 = g 3 = 6;;

map (fun x -> f (g x) ) [1; 2; 3];;


解答

map (fun x -> f (g x)) l

解答のまとめ

let rec map g l =
    match l with
    [] -> []
    | v :: rest ->
            (g v) :: map g rest;;

let test1 = map (fun x -> x * 2) [1; 2; 3] = [2; 4; 6];;

map (fun x -> x * x) (map (fun x -> x * 2) [1; 2; 3]);;

(*
let rec map (f g) l =
    match l with 
    [] -> []
    | v :: rest ->
            (f g) v :: (map (f g) rest);;
*)

map (fun x -> (x * 2) * (x * 2)) [1; 2; 3];;

let f x = x * x;;
let g x = x * 2;;

let test11 = f 3 = 9;;
let test12 = g 3 = 6;;

map (fun x -> f (g x) ) [1; 2; 3];;