OCaml/Tablice

Z Wikibooks, biblioteki wolnych podręczników.


Tablice są przykładem imperatywnych elementów w języku OCaml. Można by zapytać: ,,Co w nich takiego imperatywnego?. Większość typów w Camlu jest niezmienna (ang. immutable). Dla przykładu listy. Jeśli raz stworzymy listę i potem zachcemy zmienić w niej jeden element musimy całą listę zbudować od nowa zmieniając jeden element. Właściwie podobnie jest z etykietami. Tablice natomiast można dowolnie zmieniać. Można także w ten sam sposób postąpić z rekordami (używając słowa kluczowego mutable).

  1. # let arr = [| "Hello"; "World" |];;     
    
  2. val arr : string array = [|"Hello"; "World"|]
    
  3.  
    
  4. # arr.(0);;
    
  5. - : string = "Hello"
    
  6.  
    
  7. # arr.(0) <- "test";;
    
  8. - : unit = ()
    
  9.  
    
  10. # arr.(1).[4];;
    
  11. - : char = 'd'
    
  12.  
    
  13. # arr.(1).[4] <- 'X';;
    
  14. - : unit = ()
    
  15.  
    
  16. # arr;;              
    
  17. - : string array = [|"test"; "WorlX"|]
    

W powyższym przykładzie w linii pierwszej stworzona została tablica z przypisaną jej nazwą "arr". Następnie odwołaliśmy się do pierwszego elementu tablicy (o indeksie zero) i zmieniliśmy jego wartość na ciąg "test".

W linii 10, odwołaliśmy się do pojedynczego znaku ciągu. Jak widać robi się to z wykorzystaniem zapisu: ciąg.(indeks), czyli używając nawiasu okrągłego -- nie kwadratowego jak to się dzieje w przypadku tablic. Następnie zmieniliśmy ów znak ciągu na inny. Ciągi znaków też mają imperatywną charakterystykę w Camlu -- jeśli ktoś potrzebuje czysto funkcyjne ciągi tworzy je jako listę znaków. Są trochę wolniejsze o tych wbudowanych natywnie język. W module Pervasives jest zdefiniowany operator '^' -- funkcja, która pobiera dwa ciągi i zwraca jeden, będący sklejeniem ciągów składowych.