Power Query 闭包和递归;这方面的教科书?
Power Query Closures and Recursion; Textbooks on this?
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
结果table是
1 1
2 Error
3 Error
5 Error
错误消息为 'Fib not found, did you forget to import a module?'
还有其他解决办法吗?或者,如果我需要一个递归函数,它是否必须作为自己的查询成立?
Meta queries -- 在M中,是一个本地定义的函数like
Fib = (X)=> if X <= 1 then 1 else X + Fib(X - 1)
称为闭包,或lambda 表达式,或什么?我见过他们用过,只是没听说过他们 named。所以我不确定如何搜索关于他们的帖子。
是否有好的教科书或在线资源可以教会我有关 Power Query 闭包的所有知识?我的首选文本 M 是 (DATA) Monkey,几乎没有提及它们。大多数情况下,我只想要一大堆例子。我想了解
- 何时使用它们
- 递归与互递归
- 它们与使用 each
的关系/比较
- 多语句闭包 - 在 let 中使用 let .
- 调试它们
如果你想递归调用一个函数,你需要添加一个@,即所谓的"scoping operator",所以这段代码是可以的(我只是在你的代码中将@添加到"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)。
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
结果table是
1 1
2 Error
3 Error
5 Error
错误消息为 'Fib not found, did you forget to import a module?'
还有其他解决办法吗?或者,如果我需要一个递归函数,它是否必须作为自己的查询成立?
Meta queries -- 在M中,是一个本地定义的函数like
Fib = (X)=> if X <= 1 then 1 else X + Fib(X - 1)
称为闭包,或lambda 表达式,或什么?我见过他们用过,只是没听说过他们 named。所以我不确定如何搜索关于他们的帖子。
是否有好的教科书或在线资源可以教会我有关 Power Query 闭包的所有知识?我的首选文本 M 是 (DATA) Monkey,几乎没有提及它们。大多数情况下,我只想要一大堆例子。我想了解
- 何时使用它们
- 递归与互递归
- 它们与使用 each 的关系/比较
- 多语句闭包 - 在 let 中使用 let .
- 调试它们
如果你想递归调用一个函数,你需要添加一个@,即所谓的"scoping operator",所以这段代码是可以的(我只是在你的代码中将@添加到"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)。