Haskell,自然数列表

Hel*_*nar 11 haskell list stream lazy-evaluation

我是Haskell的绝对新手,但试图了解它是如何工作的.

我想写自己的整数懒惰列表,如[1,2,3,4,5 ...].

我写的那些清单

ones = 1 : ones
Run Code Online (Sandbox Code Playgroud)

当尝试,工作正常:

*Main> take 10 ones
[1,1,1,1,1,1,1,1,1,1]
Run Code Online (Sandbox Code Playgroud)

如何增加整数呢?

我试过这个,但确实失败了:

int  = 1 : head[ int + 1]
Run Code Online (Sandbox Code Playgroud)

之后,我如何制作一个两个流相乘的方法?如:

mulstream s1 s2 = head[s1] * head[s2] : mulstream [tail s1] [tail s2]
Run Code Online (Sandbox Code Playgroud)

sep*_*p2k 21

int = 1 : head [ int + 1]无效的原因是:

  • head返回单个元素,但第二个参数:需要是一个列表.
  • int + 1 尝试添加列表和数字,这是不可能的.

创建从1到无穷大的列表的最简单方法是 [1..]

要计算1以外的步数,您可以使用[firstElement, secondElement ..],例如创建所有正奇数整数的列表:[1,3 ..]

要获得[x, f x, f (f x), f (f (f x)),...]可以使用的表单的无限列表iterate f x,例如iterate (*2) 1将返回列表[1, 2, 4, 16,...].

要在两个列表的每对元素上成对应用操作,请使用zipWith:

mulstream s1 s2 = zipWith (*) s1 s2
Run Code Online (Sandbox Code Playgroud)

为了使这个定义更简洁,您可以使用无点形式:

mulstream = zipWith (*)
Run Code Online (Sandbox Code Playgroud)


Łuk*_*Lew 18

对于自然数,您必须使用map:

num1 = 1 : map (+1) num1
Run Code Online (Sandbox Code Playgroud)

或者理解:

num2 = 1 : [x+1 | x <- num2]
Run Code Online (Sandbox Code Playgroud)

或者当然:

num3 = [1..]
Run Code Online (Sandbox Code Playgroud)

  • 或者`nat = 1:map succ nat` (5认同)

clo*_*ord 5

语言中有这样的语法:

take 10 [1,2..]

=> [1,2,3,4,5,6,7,8,9,10]
Run Code Online (Sandbox Code Playgroud)

你甚至可以做不同的步幅:

take 10 [1,3..]
=> [1,3,5,7,9,11,13,15,17,19]
Run Code Online (Sandbox Code Playgroud)


小智 5

我不确定这是否是您所要求的,但在我看来,您想构建一个自然数递增列表,而不依赖于任何其他列表。因此,据此,您可以做类似的事情

incr a = a : inrc (a+1)
lst = inrc 1

take 3 lst
=> [1,2,3]
Run Code Online (Sandbox Code Playgroud)

从技术上讲,这被称为累积函数(我相信),然后我们所做的就是制作一个特殊情况,可以轻松地使用 ' lst'

你可能会从那里发疯,做这样的事情:

lst = 1 : incr lst where incr a = (head a) + 1 : incr (tail a)

take 3 lst
=> [1,2,3]
Run Code Online (Sandbox Code Playgroud)

等等,虽然这可能依赖于一些你还没有学到的东西(在哪里)——根据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)
Run Code Online (Sandbox Code Playgroud)

safemul我相信,您可以通过尝试该函数来找出原因,但它与“ ”(以及“ ”)lmul有关。问题是,在 中不存在空列表、不匹配的列表等情况,因此您要么必须将各种定义拼凑在一起(),要么使用守卫和或等等......或者坚持使用: )tailheadlmullmul _ [] = []wherezipWith