リストと関数を取り、それから BST を作成する関数標準 ml を作成したいと考えています。関数の型は:'a list -> ('a * 'a -> bool) -> 'a tree
ですが、いくつか問題があります。私が書いたコードは次のとおりです。
datatype 'data tree =
EMPTY
| NODE of 'data tree * 'data * "data tree;
fun makeBST [] f = EMPTY
| makeBST (x::xs) f =
let
fun insert EMPTY x = NODE(EMPTY, x, EMPTY)
| insert (NODE(left, root, right)) x =
if f(x, root) then
insert left x
else
insert right x
in
makeBST xs f
end;
この関数で取得しているタイプは次のとおりです'a list -> ('b * 'c -> bool) -> 'd tree
。それを呼び出そうとすると、次のようmakeBST [4, 3, 6, 7, 8, 2, 0, 1] (op <);
に次のエラーが発生します。
stdIn:16.1-16.40 Warning: type vars not generalized because of
value restriction are instantiated to dummy types (X1,X2,...)
val it = EMPTY : ?.X1 tree
コードの何が問題になっていますか? ありがとう
編集:
私のコードの2番目のバージョン:
fun makeBST [] f = EMPTY
| makeBST (x::xs) f =
let
val tree = EMPTY
fun insert EMPTY x = NODE (EMPTY, x, EMPTY)
| insert (NODE(left, root, right)) x =
if f(x, root) then
insert left x
else
insert right x
in
insert (makeBST xs f) x
end;
このコードは私が望む型を生成しましたが、それは正しいですか?