Power Query Closures和Recursion;这本教科书?

时间:2017-08-11 15:30:29

标签: excel recursion closures powerquery m

Power Query M语言中的闭包可以递归吗?

函数可以递归。我将函数查询命名为Fibonacci,定义为

(X) => 
let
    Fib = if X <= 1 then 1 else X + Fibonacci(X - 1)
in
    Fib

工作正常。但是当我尝试在一个查询中站起来时,它会失败:

let
    Fib = (X)=> if X <= 1 then 1 else X + Fib(X - 1),
    Source = Table.FromRecords({[X=1],[X=2],[X=3],[X=5]}),
    UseIntFib = Table.AddColumn(Source, "Fib", each Fib([X]) )
in
    UseIntFib

结果表是

1    1
2    Error
3    Error
5    Error

错误&#39;消息是&#39;未找到Fib,您是否忘记导入模块?&#39;

还有其他方法吗?或者,如果我需要一个递归函数,它是否必须作为自己的查询站起来?

元查询 - 在M中,是一个本地定义的函数,如

Fib = (X)=> if X <= 1 then 1 else X + Fib(X - 1)

称为闭包,或 lambda表达式,或者是什么?我已经看过他们使用过,只是没有听说过他们名为。因此,我不确定如何搜索有关他们的帖子。

是否有一本好的教科书或在线资源可以告诉我关于Power Query闭包的所有信息?我的首选文字 M代表(DATA)Monkey ,几乎没有任何关于它们的内容。大多数情况下,我只是喜欢一大堆的例子。我想了解

  • 何时使用
  • 递归和相互递归
  • 与使用每个
  • 相关/比较的方式
  • 多语句闭包 - 在 let 中使用 let
  • 调试它们

1 个答案:

答案 0 :(得分:1)

如果你想以递归方式调用一个函数,你需要添加一个@作为所谓的“作用域运算符”,所以这段代码没问题(我只是在你的代码中将@添加到“Fib”):

let
    Fib = (X)=> if X <= 1 then 1 else X + @Fib(X - 1),
    Source = Table.FromRecords({[X=1],[X=2],[X=3],[X=5]}),
    UseIntFib = Table.AddColumn(Source, "Fib", each Fib([X]) )
in
    UseIntFib

您可以在Power Query语言规范(2016年10月)中找到更多信息:https://msdn.microsoft.com/en-us/library/mt807488.aspx?f=255&MSPPError=-2147217396

(3.3.1第28页,6.3页第58页,最后但并非最不重要的是第91/92页的9.4 / 9.5)。