2017-08-11 6 views
-1

Les fermetures dans le langage Power Query M peuvent-elles être récursives?Fermetures de requêtes de puissance et récursion; Des manuels sur ça?

Les fonctions peuvent être récursives. Je nomme une fonction-requête Fibonacci, définie comme

Cela fonctionne très bien. Mais quand je tente de se tenir debout dans une seule requête, il perd:

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 

Le tableau qui en résulte est

1 1 
2 Error 
3 Error 
5 Error 

avec les erreurs de message étant « Fib introuvable, avez-vous oublié d'importer un module?

Existe-t-il un autre moyen de contourner ce problème? Ou, si j'ai besoin d'une fonction récursive, doit-elle être considérée comme sa propre requête?

interroge Meta - Dans M, est une fonction définie localement comme

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

appelé fermeture, ou une expression lambda, ou quoi? Je les ai vus utilisés, mais je ne les ai pas entendus nommé. Donc, je ne sais pas comment rechercher des messages à leur sujet.

Existe-t-il un bon manuel ou une source en ligne qui m'apprendrait tout sur les fermetures Power Query? Mon go-to texte, M est pour (DATA) Singe, dit presque rien à leur sujet. Surtout, je voudrais juste un tas d'exemples. Je veux savoir sur

  • Quand les utiliser
  • Recursion et récursion mutuelle
  • Comment ils se rapportent/comparer à l'aide chaque
  • fermetures à plusieurs instructions - à l'aide laisser dans un laisser.
  • les Débogage
+1

Si vous serez si aimable de répondre à ma réponse à votre question précédente https://stackoverflow.com/questions/45623765/excel-power-query-using-list-matchany-on-a-column-value Je vais envisager de réagir sur cette nouvelle question. – MarcelBeug

+0

Fait, et merci. J'apprends toujours mon chemin autour de StackOverflow; désolé je n'ai pas répondu rapidement. –

Répondre

1

Si vous voulez appeler une fonction récursive, vous devez ajouter un @ comme soi-disant « opérateur de portée », donc ce code est OK (je viens d'ajouter @ à « Fib » dans votre Code):

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 

Vous pouvez trouver plus d'informations dans la Query Language Specification Puissance (Octobre 2016): https://msdn.microsoft.com/en-us/library/mt807488.aspx?f=255&MSPPError=-2147217396

(3.3.1 page 28 6.3 Page 58, et last but not least 9,4/9,5 aux pages 91/92).

+0

Merci Marcel, à la fois pour le code-fix et pour les références.Tu sais, j'avais téléchargé le Language Spec quand j'ai commencé à apprendre M, mais j'étais simplement dépassé quand j'ai essayé de le comprendre. (Trop, trop tôt.) Après votre note, j'ai creusé et lu où vous avez pointé. C'est beaucoup plus logique pour moi maintenant. –