2016-04-09 34 views
1

Belirtimine sahip listeyi kullanarak bir tür veri yapısı oluşturmak istiyorum: (string * int) ilk öğenin anahtar olduğu ve ikinci elemanın değer olduğu liste. Öncelikle bu haritayı oluşturduğumda, hiçbir değeri olmayan anahtarı vermek istiyorum. Bu durumda boş değeri nasıl geçebilirim? başlatılırken Örneğin, böyle bir şey gerekir:sml içinde bir listenin tuple tutulması null değeri

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

, ben belirli anahtar karşılık gelen değerini düzenlemek için mümkün olmalıdır. Mesela ben

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

geçmek mümkün olmalıdır, demek gibi bir şey:

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

cevap

1

listede geçerli ints tüm bir null değer olarak 0 kullanabilirsiniz kesinlikle olumlu ise, veya ~1, 0 geçerli ise, ancak negatifler değildir. Aksi halde, int option'u kullanabilirsiniz. Bir şey gibi:

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; 

O zaman, örneğin:

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

yapabilirsiniz böylece gibi "değişim" değerler:

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

Değerler böyle okunabilir:

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

Not: lookup thr anahtar sözlükte yoksa bir hata yapar. NONE'u girişler için boş bir değer olarak kullandığımız için, bir anahtarın yokluğu için bir işaret olarak da çalışamaz.

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

korkutmak yukarıda yeni bir liste oluşturur ve isim gamma için bağlamalar set bu yaklaşımla çünkü vardı etrafında "değişim" tırnak:

gerçek değerler

valOf operatörünü kullanarak seçenekler elde edilebilir yerine gamma'u değiştirmek yerine. Bu liste büyükse, bu (listenin üzerindeki sabit doğrusal aramaların yanı sıra) oldukça verimsiz hale gelir. Bir aşamada, değiştirilebilir veri yapılarını (örneğin, refs'un sıralanmış dizileri) kullanmaya başlamak isteyebilirsiniz.