У меня есть код, как это:Haskell рекурсии в списках
appd (a:e) ((c,b):bs) | a == c && bs /= [] = b:appd(a:e) bs
| a /= c && bs /= [] = appd (a:e) bs
| a /= c && bs == [] = appd e ((c,b):bs)
| otherwise = b:appd e ((c,b):bs)
Это петли повсеместно в два списка, как [1,2,3]
и [(1,2),(6,5),(3,5)]
и принимает первый элемент из первого списка и сравнивает его с первым элементом каждого кортежа в другом списке , если они равны, то сохраните второй элемент этого кортежа. Он отлично работает, но сравнение не работает, если я беру второй элемент первого списка, в данном случае 2
.
Например, если у меня есть списки, как [1,2,3]
и [(1,2),(6,5),(3,5)]
, то функция принимает 1
из первого списка и сравнивает с 1
, затем 6
, затем 3
, что работает, но он не принимает второй элемент первого списка - 2
и не повторяет сравнение. Что не так?
Не удалось воспроизвести: в моих тестах он действительно возвращает результаты в сочетании с '1',' 2' и '3'; например, 'appd [1,2,3] [(1,2), (6,5), (3,5)]', как представляется, правильно возвращает как '2' из' (1,2) ', так и '5' из' (3,5) 'перед сбоем. Если я добавлю '(2,4)' в конце, он вернет '4' перед сбоем. Однако эта функция плохо частичная - она в конечном счете падает почти на каждом входе. Возможно, если вы исправите это (попробуйте проверить вывод GHC на '-fwarn-incomplete-patterns'), он будет вести себя так же, как вы этого хотите. –
Способ ответа на ваш вопрос состоит в том, чтобы взять тестовый пример, который вы выделили ('appd [1,2,3] [(1,2), (6,5), (3,5)]') и внимательно следите за его исполнением в своей голове, на бумаге или с отладчиком, и тщательно размышляйте. – jberryman
Я пробовал, но не вижу ошибки – dreamPr