練習問題 14.2 拡張リスト
拡張リストを単なるリストに変換する関数 list_of_alist を定義しなさい。
# list_of_alist;;
- : ([< `App of 'a * 'a | `Cons of 'b * 'a | `Nil ] as 'a) ->
([> `Cons of 'b * 'c | `Nil ] as 'c)
= <fun>
解答
#use "ex14-1.ml";; (* append関数を使う *)
let l1 = `Nil
and l2 = `Cons (1, `Nil)
and l3 = `Cons (2, `Cons (1, `Nil));;
let l4 = `Cons (3, `Cons (4, `Nil));;
let l6 = `Cons (1, `App(l3, l4));;
let rec list_of_alist = function
`Nil -> `Nil
| `Cons (a, l) ->
`Cons (a, list_of_alist l)
| `App (l1, l2) ->
append (list_of_alist l1) (list_of_alist l2);;
(*
val list_of_alist :
([< `App of 'a * 'a | `Cons of 'b * 'a | `Nil ] as 'a) ->
([ `Cons of 'b * 'c | `Nil ] as 'c) = <fun>
*)
list_of_alist l6;;
(*
- : [ `Cons of int * 'a | `Nil ] as 'a =
`Cons (1, `Cons (2, `Cons (1, `Cons (3, `Cons (4, `Nil)))))
*)