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
).