Haskell loopupKey

#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. Спасибо, я попробую реализовать только сейчас