Пары ключ-значение Укажите функцию, которая извлекает значение для данного ключа из списка пар ключ-значение. Если ключ не указан, вернуть значение по умолчанию. Первым параметром функции должен быть искомый ключ, вторым — значение по умолчанию, а третьим — список!
Я хотел бы вернуть остальную часть списка, но я не знаю, как это сделать в моем коде. Кто-нибудь может помочь?
value :: Eq a => a -> b -> [(a, b)] -> b
value a b ((c, d): xs)
| a == c = d
| otherwise = b -- : value xs ?
Examples:
value "aaa" "notFound" [] == "notFound"
value "1" "notFound" [("1", "haskell")] == "hasFell"
value 5 "" [(0, "C++"), (5, "python"), (4, "rust")] == "python"
value 4 "" [(0, "C++"), (5, "python"), (4, "rust")] == "rust"
value 4 "" [(0, "C++"), (5, "python"), (4, "go")] == "go"
value 5 "scala" [(0, "C++"), (5, "python")] == "python"
value 3 "scala" [(0, "C++"), (1, "java"), (5, "python"), (4, "rust")] == "scala"
value 'b' False [('a', False), ('b', True)] == True
Реализуя функцию напрямую, вы возвращаете b
только в том случае, если список равен пустой; в противном случае вам нужно сделать рекурсивный вызов.
Необходимо рассмотреть случаи три:
Вы правильно определили, что делать для случая 2, но не рассмотрели случай 1. В случае 3 вам нужно выполнить тот же вид поиска, но теперь с более коротким списком (поскольку вы можете игнорировать первую пару); вам просто нужно рекурсия с соответствующими аргументами.
value :: Eq a => a -> b -> [(a, b)] -> b
value key def [] = ? -- What do you return when the list is empty
value key def ((k, v):rest) | key == k = v
| otherwise = value ? ? ? -- What arguments do you pass now?
Подсказка: случай с пустым списком важен не только потому, что вы хотите охватить все возможности, но и потому, что если вам нужно вернуть значение по умолчанию, рекурсивный вызов будем в конечном итоге будет вызван для пустого списка.
value :: Eq a => a -> b -> [(a,b)] -> b value a b [] = b value a b ((c,d):xs) | a==c = d | otherwise = value xs -- I need the rest of the list, am I right ?
@mano19 В | otherwise = value xs
вам нужно три аргумента для вызова value
. Обратите внимание на три "?" в опубликованной подсказке выше. xs
это только один аргумент. Остальной код выглядит нормально.
lookup
дает вам значениеMaybe
, которое указывает, успешен ли поиск или нет;maybe
принимает значение по умолчанию иMaybe
и предоставляет обычное значение. Комбинируйте по мере необходимости.