match tree with | Leaf x -> f x |> Leaf | Node (left, right ) -> let leftResult = map f left let rightResult = map f right Node(leftResult, rightResult) 22
= let rec mapInner tree cont = match tree with | Leaf x -> Leaf(f x) |> cont | Node (left, right) -> mapInner left (fun leftResult -> mapInner right (fun rightResult -> Node(leftResult, rightResult) |> cont)) mapInner tree id 24
= let rec mapInner tree cont = match tree with | Leaf x -> Leaf(f x) |> cont | Node (left, right) -> mapInner left (fun leftResult -> mapInner right (fun rightResult -> Node(leftResult, rightResult) |> cont)) mapInner tree id > map ((*) 2) (Node (Leaf 1, Leaf 2));; val it: int Tree = Node (Leaf 2, Leaf 4) 25
初回はNodeのパターンに入る。 mapInner を left とそれ以降の計算を引数に再帰呼 出しをする let map f tree = let rec mapInner tree cont = match tree with | Leaf x -> Leaf(f x) |> cont | Node (left, right) -> //このケースに入る mapInner left (fun leftResult -> mapInner right (fun rightResult -> Node(leftResult, rightResult) |> cont)) mapInner tree id 26
right (fun rightResult -> Node(leftResult, rightResult) |> id 2回目は Leaf のパターン。引数で受け取った関数 f を適用して cont を呼ぶ。 let map f tree = let rec mapInner tree cont = match tree with | Leaf x -> //このケースに入る Leaf(f x) |> cont | Node (left, right) -> mapInner left (fun leftResult -> mapInner right (fun rightResult -> Node(leftResult, rightResult) |> cont)) mapInner tree id 27
2, rightResult) |> id) 今回も Leaf のケースに入る let map f tree = let rec mapInner tree cont = match tree with | Leaf x -> //このケースに入る Leaf(f x) |> cont | Node (left, right) -> mapInner left (fun leftResult -> mapInner right (fun rightResult -> Node(leftResult, rightResult) |> cont)) mapInner tree id 29
cont = match tree with | Leaf x -> Leaf(f x) |> cont | Node (left, right) -> mapInner left (fun leftResult -> mapInner right (fun rightResult -> Node(leftResult, rightResult) |> cont)) mapInner tree id 31