我不确定这是否是您要问的,但在我看来,您想建立一个增加自然数的列表,而不依赖任何其他列表。所以,通过这个令牌,你可以做类似的事情
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
| null a || null b = []
| otherwise
= (head a * head b) : safemul (tail a) (tail b)
的原因safemul
,我相信,你可以通过试验函数找到lmul
,但它与 ' tail
' (和 ' head
' 也是如此)有关。问题是,在 中没有空列表、不匹配列表等情况lmul
,因此您要么必须将各种定义 ( lmul _ [] = []
) 拼凑在一起,要么使用守卫和 orwhere
等等......或者坚持使用zipWith
: )