2016-04-09 7 views
1

Ich möchte eine Art von Datenstruktur mit einer Liste mit Spezifikation erstellen: (string * int) Liste, wo das erste Element Schlüssel und das zweite Element Wert ist. Zunächst möchte ich beim Erstellen dieser Map einen Schlüssel ohne Wert angeben. Wie kann ich in diesem Fall Null-Wert übergeben? Zum Beispiel, ich brauche so etwas bei der Initialisierung:Null-Wert im Tupel einer Liste in sml halten

val gamma = [("a",_),("b",_),("c",_)] :(string*int) list 

Natürlich soll ich in der Lage sein, den Wert zu bearbeiten, um bestimmte Schlüssel entspricht. Zum Beispiel sollte ich in der Lage sein

[("a",_),("b",_),("c",_)] 

zu, so etwas sagen wie zu ändern:

[("a",20),("b",30),("c",40)] 

Antwort

1

Wenn alle gültigen ints in der Liste streng positiv sind Sie 0 als Nullwert verwenden könnte, oder vielleicht ~1, wenn 0 gültig ist, aber negative nicht. Andernfalls könnten Sie eine int option verwenden. Etwas wie:

fun set key value [] = [] 
| set key value ((k,v)::pairs) = 
     if k = key then (k, SOME value) :: pairs 
     else (k,v) :: (set key value pairs) 

fun lookup key ((k,v)::pairs) = 
     if k = key then v else lookup key pairs 

fun initDict keys = map (fn k => (k,NONE)) keys; 

Dann, zum Beispiel:

- val gamma = initDict ["a","b","c"]: (string * int option) list; 
val gamma = [("a",NONE),("b",NONE),("c",NONE)] : (string * int option) list 

Sie können "change" die Werte wie so:

= set "b" 30 gamma; 
[("a",NONE),("b",SOME 30),("c",NONE)] : (string * int option) list 

Werte kann wie folgt gelesen werden:

- lookup "a" gamma; 
val it = NONE : int option 
- lookup "b" gamma; 
val it = SOME 30 : int option 

Beachten Sie, dass lookup thr Es tritt ein Fehler auf, wenn sich der Schlüssel nicht im Wörterbuch befindet. Da wir NONE als Nullwert für Einträge verwenden, kann er nicht als Flag für das Fehlen eines Schlüssels fungieren.

- valOf (lookup "b" gamma); 
val it = 30 : int 

Der Schrecken zitiert um „change“ oben waren, weil bei diesem Ansatz set eine neue Liste konstruiert und bindet es an den Namen gamma:

Die tatsächlichen Werte können von den Optionen mit dem valOf Operator extrahiert werden anstatt gamma an Ort und Stelle zu ändern. Wenn diese Liste insgesamt groß ist, würde dies (wie auch die konstanten linearen Suchen über die Liste) ziemlich ineffizient werden. Irgendwann möchten Sie möglicherweise mit veränderbaren Datenstrukturen beginnen (z. B. sortierte Arrays von refs).