Я довольно новичок в Haskell. Я боролся с очень долго и перепробовал все, что мог придумать. Я хочу, чтобы функция выполняла проверку первого ненулевого элемента, уменьшение его на 1 и увеличение следующего элемента на его позицию в списке (последний элемент начинается с позиции 1). Например:
Пример 1:
[9,0,0,0,0,0,0,0,0] -> [8,8,0,0,0,0,0,0,0] increments the next element by 8 since it's at position 8
Пример 2:
[0,0,0,0,0,0,0,3,1] -> [0,0,0,0,0,0,0,2,2] increments the next element by 1 since it's at position 1
Пример 3:
[0,0,3,2,0,0,0,0,0] -> [0,0,2,8,0,0,0,0,0] increments the next element by 6 since it's at position 6
Мой код работает для всех из случаев выше, за исключением случая, когда последний элемент ненулевой. Например:
[0,0,0,0,0,0,0,0,5] should return [0,0,0,0,0,0,0,0,4] but it gives me the error 'empty list.'
Я знаю, что мне нужно условие, которое проверяет, равна ли длина моего списка 1, и если это так, то текущий элемент должен уменьшаться только на единицу (а не увеличиваться). следующий элемент, так как его нет). Я просто не уверен, как это сделать. Это мой код:
chop :: [Int] -> [Int]
chop [] = []
chop (x:xs) =
if x > 0
then [x-1] ++ [head xs + length xs] ++ drop 1 xs
else [x] ++ chop xs