在Haskell中生成无限列表

Syz*_*orr 0 haskell list-comprehension

所以,为了准备即将到来的考试,我一直在考试一些旧考试,并遇到了这个问题:

编写Haskell代码以定义ints :: [Int]以下形式的无限列表: [0, 1, -1, 2, -2, 3, -3, 4, -4..]

过去半个小时我一直在插电,但似乎无法找到任何解决方案,或者那样做我想做的事情.我觉得我真正想要的是对表单的列表理解

ints :: [Int]
ints = [0] ++ [x (-x) | x <- [1..]]
Run Code Online (Sandbox Code Playgroud)

但这不起作用,我不确定如何让它工作

Joh*_*iss 6

问题是它x (-x)不是类型的Int(感谢@leftaroundabout在这里删除了关于无效语法的无意义).您想为每个生成两个值x.所以我想最简单的方法是创建大量的名单对[1, -1],[2, -2]......然后将它们串联在一起.显然前置一个0.

ints :: [Int]
ints = 0 : concat [[x, (-x)] | x <- [1..]]
Run Code Online (Sandbox Code Playgroud)

此外,你可能想使用Integer,而不是Int作为Int溢出在某些时候,但Integer不会.

  • 或者也许`ints = 0 :( [1 ..] >> =\x - > [x,-x])`. (6认同)
  • 当你已经使用列表理解时,为什么要使用`concat`?`ints = 0:[v | x < - [1 ..],v < - [x,-x]]` (4认同)
  • 或者,使用右折:`ints = 0:foldr(\n ns - > n:-n:ns)[] [1 ..]`. (3认同)
  • 实际上,`x(-x)`_is_有效的语法,它在类型上没有多大意义(因为`x`必须是函数和数字). (2认同)