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 ,几乎没有任何关于它们的内容。大多数情况下,我只是喜欢一大堆的例子。我想了解
答案 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)。