【问题标题】:F# generator function equivalentF# 生成器函数等效
【发布时间】:2016-05-12 08:01:18
【问题描述】:

在 ES6 风格的 JavaScript 中,引入了生成器函数,因此这种构造是可能的:

var fib = function *(max) {
  var x = 0, y = 1, tmp = 1;
  while (tmp<max) {
    yield tmp;
    x = y; 
    y = tmp;
    tmp = x + y;
  }
}
var fibgen = fib(3000);

这里的fibgen 是一个生成器,它将产生低于 3000 个斐波那契数。

F# 中的等效构造是什么?

LE:我不是在寻找algorithm for Fibonacci series。但是对于某些在迭代时会延迟发出值的生成器函数。

【问题讨论】:

  • 您尝试的解决方案在哪里?
  • 我是函数式编程的初学者。我能想到的只是命令式的实现。这不是我想要的。
  • 您应该澄清(通过编辑问题)您在寻找什么。 F# 中的等效构造实际上与使用序列表达式和可变变量相同。你想知道惯用的 F# 方法吗?还是惯用的函数式方法?
  • 我同意这还不够清楚。我不是在寻找斐波那契数列的算法。但是对于一些在迭代它时会发出一个值的生成器函数。很抱歉造成混乱!
  • 我知道您是 SO 的新手,但是在询问您尝试或发现的问题时,我们可以看到您并没有懒惰并让我们做所有事情工作。因此,您正在对您的问题投反对票。

标签: javascript f#


【解决方案1】:

this MSDN article for lazily evaluated sequences in F#。给定问题的可能解决方案,使用Seq.unfold

let fibTo limit =
    Seq.unfold (fun (a, b) -> Some (b, (b, a+b))) (0I, 1I)
    |> Seq.takeWhile (fun i -> i <= limit)

第一行创建斐波那契数列,懒惰地求值。第二个限制它。 I 是任意长度整数的文字。测试:

fibTo 3000I |> Seq.iter (printf "%A ")

输出:1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584

fibTo (pown 10I 30)

返回斐波那契数列,最高为 898923707008479989274290850145——最后一个值不大于 10^30——如果计算得那么远。

【讨论】:

    猜你喜欢
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 2015-02-09
    • 1970-01-01
    • 2014-01-25
    • 2021-03-18
    • 1970-01-01
    相关资源
    最近更新 更多