Haskell добавить два списка сопоставления с образцом - PullRequest
6 голосов
/ 14 сентября 2011

Итак, у меня есть следующее на GHCI

>let addlist [] [] = []
>let addlist (a:as) (b:bs) = (a+b) : addlist as bs
>let x = [1..5]
>let y = [6..10]
>addlist x y

Последняя строка дает мне: [7,9,11,13,15 *** Исключение:: 1: 5-49: неисчерпывающие шаблоны в списке функций

Я просто пытаюсь добавить два списка в один список ...: (

Что я сделал не так?

Спасибо

Ответы [ 3 ]

14 голосов
/ 14 сентября 2011

Обратите внимание, что у вас все еще есть проблемы с «Неисчерпывающим сопоставлением с образцом», если списки не имеют одинаковый размер! Вот решение, которое работает для всех случаев:

addList [] _ = []
addList _ [] = []
addList (a:as) (b:bs) = (a+b) : addList as bs

не два шаблона, где любой список пуст!

И еще одно последнее замечание: писать многострочные определения в GHCi очень сложно - запишите их в каком-либо редакторе в файл .hs и используйте :load MyFile.hs и :reload внутри GHCi

13 голосов
/ 14 сентября 2011

Если вы хотите определить функцию, используя сопоставление с шаблоном внутри let, вы не можете использовать один let на шаблон, как вы это сделали - это просто определит две независимые функции (вторая затеняет первую).*

Вам нужно использовать одну букву и разделять шаблоны с помощью переносов строк или, в ghci, где вы не можете использовать разрывы строк, точки с запятой.Итак:

let addlist [] [] = []; addlist (a:as) (b:bs) = (a+b) : addlist as bs
3 голосов
/ 14 сентября 2011

Обратите внимание, что у вас есть встроенная функция zipWith для объединения двух списков поэлементно с данной функцией, поэтому вы можете написать

addList xs ys = zipWith (+) xs ys

или короче

addList = zipWith (+)
...