Я не уверен, что это то, о чем вы спрашивали, но мне кажется, что вы хотели построить список возрастающих натуральных чисел, не полагаясь ни на какой другой список. Таким образом, вы можете делать такие вещи, как
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]
и так далее, хотя это, вероятно, зависит от некоторых вещей, которые вы еще не узнали (где) - судя по OP - но это все равно должно читаться довольно легко.
Ах да, а потом умножение списка. Ну, вы можете использовать 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, думаю, можно выяснить, поэкспериментировав с функцией, но она связана с «хвостом». Проблема в том, что нет случая для пустого списка, несоответствующих списков и т. д., поэтому вам либо придется собирать различные определения (lmul _ [] = []), либо использовать охранники и или где и т. д. ... или придерживайтесь zipWith :)
person
Hiato
schedule
21.03.2010