【问题标题】:Generating Infinite List in Haskell在 Haskell 中生成无限列表
【发布时间】:2015-06-10 20:04:14
【问题描述】:

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

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

在过去的半个小时里,我一直在努力解决它,但似乎找不到任何解决问题的方法,或者可以满足我的要求。我觉得我真正想要的是表单的列表理解

ints :: [Int]
ints = [0] ++ [x (-x) | x <- [1..]]

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

【问题讨论】:

  • x 是一个数字,而不是一个函数...
  • 另见universe 包,它以universe 的名义提供ints,并且适用于许多类型,而不仅仅是Int。 Integer 的顺序与此处给出的顺序相匹配(尽管不是 Int 的顺序);我敢打赌你无论如何都想要Integer,因为你声称你想要一个无限列表,而ints 不是。

标签: haskell list-comprehension


【解决方案1】:

问题是x (-x) 不是Int 类型(感谢@leftaroundabout 在这里删除了关于无效语法的废话)。您想为每个x 生成两个值。所以我想最简单的方法是创建许多列表对[1, -1]、[2, -2],...然后将它们连接在一起。显然在前面加上0。

ints :: [Int]
ints = 0 : concat [[x, (-x)] | x <- [1..]]

此外,您可能希望使用Integer 而不是Int,因为Int 会在某些时候溢出,但Integer 不会。

【讨论】:

  • 或者,右折叠:ints = 0 : foldr (\n ns -&gt; n : -n : ns) [] [1 ..].
  • 确实,坚持使用列表理解,因为这是 OP 使用的,但实际上更喜欢正确的折叠。
  • 或者ints = 0 : ([1..] &gt;&gt;= \x -&gt; [x, -x])。
  • 实际上,x (-x) 是 有效的语法,只是类型方面没有多大意义(因为x 必须既是函数又是数字) .
  • 当您已经在使用列表解析时,为什么还要使用concat? ints = 0 : [v | x &lt;- [1..], v &lt;- [x, -x]]
猜你喜欢
  • 1970-01-01
  • 2018-06-16
  • 2020-12-15
  • 1970-01-01
  • 2017-09-28
  • 2016-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多