#haskell #key
#haskell #Клавиша
Вопрос:
Я пытаюсь создать функцию, которая ищет упорядоченный список ключей, в котором нет дубликатов ключей. Где, если ключ отсутствует, он выводит «Ничего», или, если он присутствует, если он задан, он выводит «Просто» и значение. пример этого выглядит следующим образом
lookupKey "a" [("a",1),("b",2)] == Just 1
Это то, что у меня есть до сих пор
lookupKey :: Ord k => k -> [(k,v)] -> Maybe v
lookupKey x [] = Nothing
lookupKey x (k,v)
| x < k = Nothing
| x == k
Я застрял на том, как завершить остальную часть кода
Комментарии:
1.
[[k,v]]
не будет работать, поскольку[[k,v]]
представляет собой список списков элементов. В то время как ваша подпись определяет список из 2-х кортежей .2. Подсказка: что должно произойти, если
x > k
? илиx == k
?3. @WillemVanOnsem Если x == k, то выведите справедливое значение, а если x> k, то снова повторите функцию, но проверьте следующее значение? Я просто не уверен в том, как реализовать это моя 2-я неделя, занимающаяся haskell, и довольно сложно
4. @WillemVanOnsem исправила ли моя правка проблему с вашим первым комментарием?
5. нет, поскольку это просто 2-кортеж, а не список из 2-х кортежей.
Ответ №1:
Основная проблема заключается в [[k,v]]
шаблоне. Это список списков, где внутренний список содержит два элемента: k
и v
. Но это не 2-кортеж.
Шаблон должен быть:
lookupKey x ((k, v): kvs)
| x < k = Nothing
| x == k = Just …
| otherwise = …
Здесь k
и v
приведены элементы первого 2-го кортежа, а kvs
также список остальных элементов. Итак, если мы вызываем lookupKey "a" [("a", 1), ("b", 2)]
, то x
есть "a"
, k
есть "a"
, v
есть 1
и kvs
есть [("b", 2)]
. Таким образом, вам нужно будет выполнить некоторую рекурсию kvs
.
Я оставляю заполнение …
частей в качестве упражнения.
Комментарии:
1. Спасибо, я попробую реализовать только сейчас