0

基本的に、ノードと 2 つのサブヒープからヒープを作成する関数が必要です。ヒープの表現は次のとおりです (Cons の int はノードのランクを表します)。

datatype 'a heap = Empty | Heap of int * 'a * 'a heap *  'a heap

私の機能は次のとおりです。

fun makeHeap x h1 h2 = Heap ((rank h1)+1, x, h1, h2)

プログラムはコンパイルされますが、makeHeap を呼び出すと、ヒープではなく奇妙な値が得られます。

makeHeap(#"c", Empty, Empty);
stdIn:72.1-72.29 Warning: type vars not generalized because of
   value restriction are instantiated to dummy types (X1,X2,...)
val it = fn
 : (char * ?.X1 heap * ?.X2 heap) heap
    -> (char * ?.X1 heap * ?.X2 heap) heap
      -> (char * ?.X1 heap * ?.X2 heap) heap
4

1 に答える 1

3

カリー化された形式で定義makeHeapしましたが、タプルされた引数で呼び出します。2 つの形式は異なる型を意味するため、交換可能ではありません。呼び出しを変更するだけです

makeHeap #"c" Empty Empty

または、定義を次のように変更します。

fun makeHeap(x, h1, h2) = ...
于 2012-09-22T13:39:09.793 に答える