2015-01-10 2 views
1

Я пытаюсь изучить haskell на данный момент, и я столкнулся с примерной проблемой, с которой у меня возникают проблемы.Добавление двух списков по точкам в haskell

Проблема заключается в том, что мы представляем, что у нас есть списки, представляющие числа, например, число 12 равно [2,1] и 148 [8,4,1], то как мы можем добавить эти два списка вместе, как если бы они были номера. Моя интуиция - это перенос чисел с добавлением более 10, подобно тому, как добавление выполняется с большими числами.

Мой код до сих пор:

addLnat [x] [y] = rem (x + y) 10 : (quot (x + y) 10) : []   
addLnat (x:xs) (y:ys) = (rem (x + y) 10) : w + head (addLnat xs ys) 
          where w = quot (x + y) 10 

Однако это не будет компилировать, и я не понимаю, почему мне это кажется как решение, например:

Если мы начнем с [ 3,2,1] и [6,6,9]. Мы добавляем 6 и 3, а фактор 0, поэтому 9: 0+ и повторяем до тех пор, пока не дойдем до финального случая.

Любые идеи о том, почему это не работает/компилируется?

+0

[Здесь] (http://coliru.stacked-crooked.com/a/4a7395053b21eec9) есть еще одна реализация, на которую вы можете посмотреть. – Shoe

+0

@Jefffrey 'take 1' - полная альтернатива для' head' и 'drop 1' для' tail', так что 'headOr 0 = sum. возьмите 1' и 'tailOr [] = drop 1'. –

+0

Я согласен с 'tailOr []' == 'drop 1'. Но не 'принимать 1', так или иначе, как' headOr'. В любом случае оба 'tailOr' и' headOr' являются более общими в возможном наборе возвращаемых значений. – Shoe

ответ

2
(rem (x + y) 10) : w + head (addLnat xs ys) 

Против : Оператор требует, чтобы на его правой стороне был указан список. Вы, вероятно, имел в виду

(rem (x + y) 10) : w + head (addLnat xs ys) : tail (addLnat xs ys) 

Будьте осторожны, что это приведет к ужасным производительности, так как вы делаете два рекурсивных вызовов, которые вызывают экспоненциальный раздутия.

Более важно, даже пренебрегая производительностью, вышесказанное выглядит неправильно, поскольку w + ... может переполняться 10. Подумайте о добавлении 1 к 9999: вам нужно добиться каскадного эффекта.

Попробуйте переделать свою функцию так, чтобы она приняла дополнительный аргумент carry.

Смежные вопросы