在Haskell中生成无限的相同元素列表

AMI*_*HAD 2 haskell functional-programming

在Haskell编程语言中,我们如何生成相同元素的无限列表.Haskell中的代码是什么,用户输入生成的那个数字的一​​些数字和无限列表.我练习但是没有成功.我的逻辑如下:代码:

repeat :: a -> [a]
repeat x = xs where 
          xs=x*xs
Run Code Online (Sandbox Code Playgroud)

Wil*_*sem 8

你是相当接近,但在这里,奇怪的是,你写的x*xs,(*)是通常用于操作员号,它是一个函数,是一个方法Num类型类.

如果构造列表,则使用列表数据构造函数.两个数据构造函数是[] :: [a](空列表),和(:) :: a -> [a] -> [a].在这里使用(:)运算符是有意义的:我们在前面xs加上x,所以我们可以写:

repeat :: a -> [a]
repeat x = xs
    where xs = x : xs
Run Code Online (Sandbox Code Playgroud)

因此,我们在这里为给定的x参数构建一个链接列表,如下所示:

+-------+
|  (:)  |<-|
+---+---+  |
| o | o |  |
+-|-+-|-+  |
  v   `----'
  x
Run Code Online (Sandbox Code Playgroud)

所以尾部指的是"cons"元素.因此,如果执行某些列表处理,则内存使用量可能保持不变(没有垃圾回收),因此Haskell会在同一个 cons对象中循环.

  • @AJFarmar:如果您遍历列表,这将导致线性内存使用.正如他们所说的"*如果你说出来的话,Haskell会记住它*".如果你使用`x:repeat x`,那么你会懒洋洋地继续调用尾巴.使用你给定的重复功能,如果你在l!100000000000 + l !! 100000000000中调用`let l = repeat 14',你最终会耗尽内存. (2认同)