Я не уверен, что это то, о чем вы спрашивали, но мне показалось, что вы хотите составить список растущих натуральных чисел, не полагаясь на какой-либо другой список. Таким образом, вы можете делать такие вещи, как
incr a = a : inrc (a+1)
lst = inrc 1
take 3 lst
=> [1,2,3]
Это, технически, называется накопительной функцией (я полагаю), и тогда все, что мы сделали, - это сделали специальный случай, который легко использовать с помощью 'lst'
Вы можете сойти с ума, делая такие вещи, как:
lst = 1 : incr lst where incr a = (head a) + 1 : incr (tail a)
take 3 lst
=> [1,2,3]
и так далее, хотя это, вероятно, основывается на некоторых вещах, которые вы еще не узнали (где) - судя по ОП - но это все равно должно читаться довольно легко.
Да, верно, а затем умножение списка. Ну, вы можете использовать zipWith (*), как упомянуто выше, или вы можете изобрести колесо вот так (это веселее, поверьте мне:)
lmul a b = (head a * head b) : lmul (tail a) (tail b)
safemul a b = take (minimum [len a, len b]) (lmul a b)
Причину safemul, я полагаю, вы можете выяснить, поэкспериментировав с этой функцией, но это связано с «tail». Проблема в том, что нет пустого списка, несоответствующих списков и т. Д., Поэтому вам придется либо взламывать различные определения (lmul _ [] = []), либо использовать охранники и / или где и так далее. ... или придерживаться zip с:)