2017-08-11 79 views
-1

Power Query M語言中的閉包可以遞歸嗎?電源查詢閉包和遞歸;關於這個的教科書?

函數可以是遞歸的。我命名爲函數查詢斐波那契,定義爲

(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 

與錯誤的消息是「纖維蛋白原沒有發現,你忘了導入一個模塊?'

是否有其他解決方法?或者,如果我需要遞歸函數,它是否必須作爲自己的查詢來站起來?

元查詢 - 在男,就像

本地定義的函數
Fib = (X)=> if X <= 1 then 1 else X + Fib(X - 1) 

稱爲關閉lambda表達式,還是什麼?我見過'他們用過,只是沒有聽到'電子名爲。所以我不確定如何搜索關於他們的帖子。

有沒有一本很好的教科書或在線資源可以教會我所有關於Power Query關閉的知識?我的前往文本,M是(DATA)猴子,幾乎沒有提到他們。大多數情況下,我只想要大量的例子。我想了解一下

  • 當使用它們
  • 遞歸和互遞歸
  • 如何與/比較使用每個
  • 多語句關閉 - 使用一個內讓
  • 調試他們
+1

如果你會如此友好地回答我對你以前的問題的答案https://stackoverflow.com/questions/45623765/excel-power-query-using-list-matchany-on-a-column-value 我會考慮對這個新問題作出反應。 – MarcelBeug

+0

完成,謝謝。我仍然在學習圍繞着StackOverflow的方式;對不起,我沒有及時回覆。 –

回答

1

如果你想遞歸調用一個函數,你需要添加一個@作爲所謂的「作用域運算符」,所以這段代碼是OK(我只是說@給「纖維蛋白原」在您的代碼):

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 

您可以在電源查詢語言規範(十月2016)的更多信息:https://msdn.microsoft.com/en-us/library/mt807488.aspx?f=255&MSPPError=-2147217396

(3.3.1第28頁,6.3頁58,和最後但並非最不重要9.4/9.5在第91/92頁)。

+0

感謝Marcel,無論是代碼修復還是參考。你知道嗎,當我第一次開始學習M的時候,我已經下載了語言規範,但是當我試圖理解它的時候,我只是不知所措。 (太多了,太快了。)在你的筆記之後,我把它挖出來,讀出你指出的地方。現在對我來說更加合理。 –