【问题标题】:How to implement an infinite list of functions in Haskell如何在 Haskell 中实现无限的函数列表
【发布时间】:2017-04-16 08:51:58
【问题描述】:

我正在使用斐波那契函数 g 的一个版本,其中:

g :: Integer -> Integer -> Integer
g i n  |  i==0   = 0
       |  i==1   = n
       |  i>1    = (n*( (g (i-1) n) + (g (i-2) n) ))

...使得 g i n 是 gi(n) 的值,部分定义 g i 是 gi

我现在想定义一个无限的函数列表:gs :: [ Integer -> Integer ],这样(gs !! i) is gi

我想拿 5 美元 [ g 3 | g <- gs] 给我[0,3,9,36,135]

谁能帮我定义这个无限列表?

【问题讨论】:

  • 请注意,您的函数效率很低,用它构建一个函数列表将产生一个低效函数列表。 (我确实想知道你为什么想要这样一个列表......我担心这可能是一个 XY 问题......)

标签: list haskell fibonacci


【解决方案1】:

您可以使用[0 ..] 获取从 0 开始的所有数字的列表。一旦你有了它,只需将g 应用于每个人。

您可以像在示例用法中那样使用列表推导式来做到这一点:

gs = [g i | i <- [0 ..]]

或者使用地图:

gs = map g [0 ..]

【讨论】:

  • 非常感谢。有没有不使用列表推导和地图的方法来做到这一点?并过滤此事
  • @bobjohnson 当然,有很多方法。例如,您可以定义自己的 map 函数并使用它。您甚至可以删除函数参数并直接使用g。你也可以去掉[0 ..],用你增加的计数器替换列表参数,而不是取列表的尾部。这真的取决于你,虽然我给出的两个版本绝对是最简单的。
  • 非常感谢。我如何只对我的函数 g 应用一个参数?
  • @bobjohnson 通过不应用第二个。就像在列表理解的示例中一样,我通过编写g i 将一个参数应用于g。如果我写了g i 0,那将应用两个参数,但由于我没有添加第二个参数,所以只有一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 2020-12-06
  • 2015-12-24
相关资源
最近更新 更多