На этом шаге мы рассмотрим функции для работы с A-списками.
В работе с ассоциативными списками часто необходимо уметь:
В языке Haskell отсутствуют встроенные функции для обработки списка конструкции, названной нами ассоциативным списком.
Построим библиотеку функций для работы с ассоциативными списками пар типа (Integer, Double).
1. Функция
assoc key alist test
Если пара элементов, удовлетворяющая тесту, найдена, то эта пара возвращается в виде списка; в противном случае возвращается пустой список.
Например:
> assoc 2 [(1,0.1),(2,0.6),(2,0.23)] (==) [(2,0.6)] > assoc 22 [(-1,3.0),(2,-4.0),(-2,6.0)] (==) [] > assoc 22 [(-1,3.0),(23,-4.1),(-2,6.2)] (>=) [(23,-4.1)] > assoc 22 [(-1,3.3),(23,-4.4),(-2,6.6)] (<=) [(-1,3.3)]
2. Функция
assoc_if alist test
Если пара, удовлетворяющая тесту, найдена, то эта она возвращается в виде списка; в противном случае возвращается пустой список.
Например:
> assoc_if [(1,3.0)] (<0) [] > assoc_if [(-22,4.1),(1,2.25)] odd [(1,2.25)] > assoc_if [(-22,4.34),(2,1.23)] even [(-22,4.34)]
3. Функция
rassoc key alist test
Если пара, удовлетворяющая тесту, найдена, то она возвращается в виде списка; в противном случае возвращается пустой список.
Например:
> rassoc 2.0 [(1,3.2)] (==) [] > rassoc -2.0 [(11,3.0),(-3,-4.0),(1,2.0)] (<) [(-3,-4.0)] > rassoc (-22.0) [(22,-22.0),(1,2.0)] (<=) [(22,-22.0)]
4. Функция
rassoc_if alist test
Если пара, удовлетворяющая тесту, найдена, то она возвращается в виде списка; в противном случае возвращается пустой список.
Например:
> rassoc_if [(1,3.2)] (<0) [] > rassoc_if [(1,3.2),(-2,4.5),(2,1.0)] (==1.0) [(2,1.0)]
5. Функция
acons x y alist
Эта функция позволяет обновлять и использовать ассоциативный список "в режиме стека".
Например:
> acons (-1) (-2.3) [] [(-1,-2.3)] > acons 1 2.1 [(1,3.0)] [(1,2.1),(1,3.0)] > acons (-2) 4.2 [(1,3.1),(-2,4.2)] [(-2,4.2),(1,3.1),(-2,4.2)]
6. Функция
pairlis lkey ldata alist
Например:
> pairlis [1,2,3,4] [11.0,22.0,33.0,44.0] [] [(1,11.0),(2,22.0),(3,33.0),(4,44.0)]) > pairlis [1,2,3] [11.0,22.0,33.0] [(5,55.0),(1,111.0),(3,333.0)] [(1,11.0),(2,22.0),(3,33.0),(5,55.0),(1,111.0),(3,333.0)])
7. Функция
rekey alist
AList=[(X1, E1),...,(Xk,Ek)] --> [X1,...,Xk].
Например:
> rekey [(1,11.1),(2,22.2),(3,33.3),(4,44.4)] [1,2,3,4] > rekey [(1,11.34)] [1] > rekey [] []
8. Функция
redata alist
AList=[(X1, E1),...,(Xk,Ek)] --> [E1,...,Ek].
Например:
> redata [(1,0.11),(2,0.22),(3,0.33),(4,0.44)] [0.11,0.22,0.33,0.44] > redata [(1,11.2)] [11.2] > redata [] []
9. Функция
acons1 x y alist
Например:
> acons1 3 33.0 [(1,11.0),(2,22.0)] > acons1 3 0.33 [(4,0.44)] [(1,11.0),(2,22.0),(3,33.0)] [(3,0.33),(4,0.44)] > acons1 3 3.3 [(1,1.1),(4,4.4)] > acons1 3 3.3 [(3,1.9)] [(1,1.1),(3,3.3),(4,4.4)] [(3,3.3),(3,1.9)]
10. Функция
acons2 x y alist
Например:
-- Добавление в начало > acons2 3 33.0 [] [(3,33.0)] -- Добавление в конец > acons2 5 55.0 [(44,4.0),(45,3.0),(3,2.0)] [(5,55.0),(44,4.0),(45,3.0),(3,2.0)] -- Добавление в середину > acons2 3 15.2 [(2,22.1),(4,11.45)] [(2,22.1),(3,15.2),(4,11.45)] -- Добавление пары, которая уже есть в списке > acons2 2 22.0 [(3,33.0),(2,22.0),(4,11.0)] [(3,33.0),(2,22.0),(4,11.0)]
11. Функция
delpair key alist
Например:
> delpair 1 [(1,11.1)] [] > delpair 3 [(1,11.0),(2,-22.0),(3,33.0),(4,44.0)] [(1,11.0),(2,-22),(4,44.0)] > delpair 4 [(1,1.1),(4,2.2),(3,3.3),(4,4.4)] [(1,1.1),(3,3.3)] > delpair 5 [(1,0.11),(2,0.22),(3,0.33),(4,0.44)] [(1,0.11),(2,0.22),(3,0.33),(4,0.44)]
12. Функция
putassoc1 key data alist
Например:
> putassoc1 2 222.2 [(1,1.1),(2,2.2),(3,3.3),(2,1.2)] [(1,1.1),(2,222.2),(3,3.3),(2.222.2)] > putassoc1 2 (-222.12) [(1,0.11),(3,0.33),(4,0.44)] [(1,0.11),(3,0.33),(4,0.44)]
13. Функция
putassoc2 key data alist
Например:
> putassoc2 2 (-10.0) [(1,11.1),(2,9.1),(3,7.1),(4,5.1)] [(1,11.1),(2,-10.0),(3,7.1),(4,5.1)] > putassoc2 4 5.2 [(1,11.0),(3,9.0),(4,7.0)] [(1,11.0),(3,9.0),(4,5.2)] > putassoc2 1 2.0 [(1,11.11)] [(1,2.0)]
На следующем шаге мы приведем текст созданной библиотеки и рассмотрим несколько примеров ее использования.