Чтобы понять это правильно, важно понять, почему вы думаете неправильно.Ваша рекурсия выглядит следующим образом:
numberL (x:xs) = ... ++ numberL xs
Таким образом, вы вычисляете numberL xs
и затем помещаете что-то перед ним.Если бы numberL xs
было правильно, то оно было бы пронумеровано от 1 и далее, как: 1:..., 2:..., 3:...
.Таким образом, вы никогда не сможете собрать numberL (x:xs)
из numberL xs
, просто добавив новые элементы спереди.Вся нумерация была бы неправильной.Вместо этого вам придется изменить всю нумерацию numberL xs
.
Поэтому проблема в том, что не очень полезно знать numberL xs
для вычисления numberL (x:xs)
, потому что numberL
всегда начинает нумерацию с 1.
Так что поднимитеограничение.Создайте функцию, которая нумерует, начиная с n
,
numberLFrom :: Int -> [String] -> [String]
numberLFrom n [] = ...
numberLFrom n (x:xs) = ...
Теперь вам нужно задать себе вопрос: чтобы набрать (x:xs)
, начиная с n
, нужно набрать xs
, начиная спод каким номером?И как тогда вы ввели цифру x
в этот результат?