2012-09-22 26 views
0

基本上,我想要一個函數從一個節點和2個子堆中創建一個堆。堆表示如下(其中利弊的INT表示節點的等級)SML值限制 - 堆

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

,我的作用是:

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

的程序comipiles但是當我打電話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 

回答

3

你在咖喱的形式定義makeHeap但tupled參數來調用它。這兩種形式意味着不同的類型,因此不可互換。只需將電話變成

makeHeap #"c" Empty Empty 

另外,該定義修改爲

fun makeHeap(x, h1, h2) = ...