Как я могу исправить свой код значения haskell и вернуть остальную часть списка?

Пары ключ-значение Укажите функцию, которая извлекает значение для данного ключа из списка пар ключ-значение. Если ключ не указан, вернуть значение по умолчанию. Первым параметром функции должен быть искомый ключ, вторым — значение по умолчанию, а третьим — список!

Я хотел бы вернуть остальную часть списка, но я не знаю, как это сделать в моем коде. Кто-нибудь может помочь?

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

lookup дает вам значение Maybe, которое указывает, успешен ли поиск или нет; maybe принимает значение по умолчанию и Maybe и предоставляет обычное значение. Комбинируйте по мере необходимости.
chepner 19.03.2022 22:24

Реализуя функцию напрямую, вы возвращаете b только в том случае, если список равен пустой; в противном случае вам нужно сделать рекурсивный вызов.

chepner 19.03.2022 22:24
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
39
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Необходимо рассмотреть случаи три:

  1. Список пуст
  2. Список не пуст, и ключ соответствует первой паре.
  3. Список не пуст, и ключ нет соответствует первой паре.

Вы правильно определили, что делать для случая 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 19.03.2022 23:06

@mano19 В | otherwise = value xs вам нужно три аргумента для вызова value. Обратите внимание на три "?" в опубликованной подсказке выше. xs это только один аргумент. Остальной код выглядит нормально.

chi 19.03.2022 23:09

Другие вопросы по теме