2012-09-22 5 views
0

Fondamentalement, je veux une fonction pour faire un tas à partir d'un nœud et 2 sous-tas. La représentation du tas est la suivante (où l'int dans Cons représente le rang du nœud)Restriction de valeur SML - Tas

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

et ma fonction est:

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

Les programmes comipiles mais quand je l'appelle makeHeap, je reçois une valeur bizarre au lieu d'un Heap:

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 

Répondre

3

Vous avez défini makeHeap sous forme cari, mais l'appeler avec des arguments uplées. Les deux formes impliquent des types différents et ne sont donc pas interchangeables. Il suffit de changer l'appel à

makeHeap #"c" Empty Empty 

Vous pouvez également modifier la définition de

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