Haskell: замена элемента с заданным ключом в списке ассоциаций - PullRequest
1 голос
/ 27 апреля 2009

Мне нужно создать функцию, которая получает ключ (как String), значение (как String) и список ассоциаций ключей и значений (как [(String, String)]). Функция предназначена для добавления пары ключ / значение в конец списка и, если ключ уже присутствует в списке со связанным значением, удаляет старое значение.

Я пытался использовать lookup в списке ключей и ассоциаций, но я не уверен, что делать с выводом - тип вывода функции lookup равен Maybe String, и я не могу кажется, делают список функций (например, отбрасывание элементов) на нем. Можно ли как-нибудь просмотреть список и удалить любой элемент списка с данным ключом, не зная значения, связанного с ним?

Ответы [ 3 ]

6 голосов
/ 27 апреля 2009

Вероятно, вам следует написать рекурсивную функцию, которая принимает новую пару ключ / значение и существующий список в качестве параметров и выполняет цикл по списку, чтобы создать новый список с добавленным новым значением. Для каждого элемента списка вы проверяете, совпадает ли ключ с тем, который вы хотите вставить. Если он отличается, вы сохраняете этот старый элемент, если он такой же, вы добавляете новый элемент вместо старого. Если вы дойдете до конца списка, не найдя ключ, просто вставьте туда новый элемент в конце.

4 голосов
/ 28 апреля 2009

Вот простая функция, которая делает то, что вы хотите. Он берет новую пару ключ-значение и помещает ее в начало заданного списка ассоциаций с отфильтрованным ключом.

addOrReplace :: Eq k => k -> v -> [(k, v)] -> [(k, v)]
addOrReplace key value assoc = (key,value):(filter ((key /=).fst) assoc)

Функция fst определяется как:

fst (first,second) = first

filter принимает предикат и список и возвращает список только с теми элементами, которые удовлетворяют предикату.

Редактировать: разделить пару ключ-значение в параметрах для addOrReplace, как предполагает Том.

4 голосов
/ 27 апреля 2009

В Haskell мы часто используем тип данных Maybe, когда не уверены, получим ли мы в результате значение или вообще ничего. Это эквивалентно обнуляемому типу в более традиционном языке, таком как Java.

Maybe определяется следующим образом:

data Maybe a = Nothing | Just a

То есть, значение может быть Nothing или Just a, где a - это объект, который вы искали. Например, если вы искали строку "foo" с помощью функции lookup, и в вашем списке был кортеж ("foo", "bar"), вы получите результат Just "bar". Однако, если вы посмотрите вверх "xyzzy", вы получите Nothing.

Мы можем взять значение Maybe и превратить его во что-то более полезное, используя функцию maybe (я знаю, что вводит в заблуждение имена - функция строчная) Это определяется следующим образом:

maybe default f (Just a) = f a
maybe default f Nothing  = default

Первый параметр является значением по умолчанию. Это то, что мы вернем, если у нас есть Nothing. В противном случае мы получаем функцию f, примененную к a, где a - это то, что нам нужно. Если вы просто хотите вернуть a, вы можете передать функцию id как f:

maybe default id (Just a) = id a

Полезно, id a = a.

Если вы хотите продолжить использовать свой текущий lookup план, вот как вы получите от него что-то полезное. Я лично предпочитаю метод sth - это будет проще на процессоре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...