私は IT 学生で、OCaml の初心者です。
最近、試験勉強をしていてこのエクササイズを見つけました。
指定: type 'a tree = Tree of 'a * 'a tree list
関数 mtree を定義します: 'a tree ->'a は、OCaml の通常の順序関係 (<=) に従って、多方向ツリー内のすべてのノードの最大値を返します。
私は以下のようなことをするようになりましたが、もちろんうまくいきません。
let rec mtree (Tree (r, sub)) =
let max_node (Tree(a, l1)) (Tree(b, l2)) =
if a >= b then (Tree(a, l1)) else (Tree(b, l2)) in
List.fold_left max_node r sub;;
これに対する回答を読んだ後、修正コードを投稿しています。
let rec mtree (Tree(r,sub)) =
let max_node (Tree(a, l1)) (Tree(b, l2)) =
if a >= b then a else b in
List.fold_left (max_node) r (List.map mtree sub);;
アイデアは同じです。ローカル関数を使用してノードを比較してリストを折り畳み、連続したレベルのノード リストで関数自体を呼び出してツリーを移動します。
ただし、まだ機能していません。fold_left 部分の max_node について不平を言うようになりました。
Error: This expression has type 'a tree -> 'a tree -> 'a
but an expression was expected of type 'a tree -> 'a tree -> 'a tree
そして、ここで私は間違いなく道に迷っています。