【问题标题】:How to define a list which evaluates to the sequence [(0,0), (1,0), (2,0), (3,0), etc.] and [(0,0), (0,1), (0,2), (0,3), etc.]如何定义一个评估为序列 [(0,0), (1,0), (2,0), (3,0) 等] 和 [(0,0), (0,1) 的列表)、(0,2)、(0,3) 等]
【发布时间】:2015-03-26 12:00:19
【问题描述】:

我是 Haskell 的初学者,我想知道如何定义两个列表,其中一个的计算结果为序列 [(0,0), (1,0), (2,0), (3,0 ), etc.] 和另一个到 [(0,0), (0,1), (0,2), (0,3), etc.]?我进行了多次尝试,但每次它只打印出第一个序列而不打印第二个序列。如果有人可以向我展示那将是多么棒。谢谢

【问题讨论】:

  • 您能告诉我们您的尝试吗?如果我们知道您面临的具体问题,我们可以更好地帮助您。
  • 提示:[0..]ziprepeat可以用来解决这个问题。您也可以使用map 而不是ziprepeat 来解决它。如果你要使用map,想一想什么函数可以将n 变成(n, 0),同样什么函数可以将n 变成(0, n)
  • 替代。提示:您可能想尝试 list-comprehensions 而不是 map - 这个任务可以很容易地用这些来解决,而且它非常接近问题 - 例如玩这个:[ x*x | x <- [0..] ]
  • 谢谢,我会试试的
  • [(i,j) | i

标签: haskell


【解决方案1】:

您可以定义一个无限的零列表:

[0, 0 ..]

您可以以类似的方式定义从0 开始的无限整数列表:

[0, 1 ..]

函数zip :: [a] -> [b] -> [(a, b)] 接受两个列表并将它们“压缩”到一个元组列表中。因此,如果我们将 zip 与上述列表表示法结合起来,我们就可以实现您的要求:

zip [0, 0 ..] [0, 1 ..]

你可以在 ghci 中试试这个:

> take 4 $ zip [0, 0 ..] [0, 1 ..]
[(0, 0), (0, 1), (0, 2), (0, 3)]
> take 4 $ zip [0, 1 ..] [0, 0 ..]
[(0, 0), (1, 0), (2, 0), (3, 0)]

使用列表理解

[ (i,0) | i <- [0..] ]

[ (0,i) | i <- [0..] ]

【讨论】:

  • 所以 [(i,j) | i
  • 没有错,只是语法不同而已。我个人觉得列表解析语法有点神秘,所以我喜欢带有zip 的版本。有很多方法可以做到这一点。
  • 无论如何我都是通过列表理解做到的。感谢大家的帮助:)
  • 我希望我可以在版本中附加理解 - @Charlie 请接受这个答案,以便我们可以关闭这个问题 - 谢谢
猜你喜欢
  • 2020-06-22
  • 1970-01-01
  • 2022-11-13
  • 1970-01-01
  • 1970-01-01
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多