Como entender as funções do Power Query M

Na linguagem de fórmula Power Query M, uma função é um mapeamento de um conjunto de valores de entrada para um único valor de saída. Uma função é gravada primeiro nomeando os parâmetros de função e, em seguida, fornecendo uma expressão para calcular o resultado da função. O corpo da função segue o símbolo de ir para (=>). Opcionalmente, as informações de tipo podem ser incluídas em parâmetros e o valor retornado da função. Uma função é definida e invocada no corpo de uma instrução let. Os parâmetros e/ou o valor retornado podem ser implícitos ou explícitos. Os parâmetros e/ou o valor retornado implícitos são do tipo qualquer. O tipo qualquer é semelhante a um tipo de objeto em outras linguagens. Todos os tipos em M derivam do tipo qualquer.

Uma função é um valor como um número ou um valor de texto e pode ser incluída em linha, assim como qualquer outra expressão. O exemplo a seguir mostra uma função que é o valor de uma variável Add, que é invocada ou executada de várias outras variáveis. Quando uma função é chamada, um conjunto de valores é especificado, que são substituídos logicamente pelo conjunto necessário de valores de entrada dentro da expressão do corpo da função.

Exemplo – parâmetros explícitos e valor retornado

let  
    AddOne = (x as number) as number => x + 1,  
    //additional expression steps  
    CalcAddOne = AddOne(5)  
in  
    CalcAddOne  

Exemplo – parâmetros implícitos e valor retornado

let  
    Add = (x, y) => x + y,  
    AddResults =   
        [  
            OnePlusOne = Add(1, 1),     // equals 2  
            OnePlusTwo = Add(1, 2)      // equals 3  
    ]  
in  
    AddResults  

Localizar o primeiro elemento de uma lista maior que 5 ou nulo, caso contrário

let  
    FirstGreaterThan5 = (list) =>   
        let   
            GreaterThan5 = List.Select(list, (n) => n> 5),  
            First = List.First(GreaterThan5)  
        in  
            First,  
    Results =   
    [  
            Found    = FirstGreaterThan5({3,7,9}),  // equals 7  
            NotFound = FirstGreaterThan5({1,3,4})   // equals null  
    ]  
in  
    Results  

As funções podem ser usadas recursivamente. Para referenciar recursivamente a função, prefixe o identificador com @.

let   
    fact = (num) => if num = 0 then 1 else num * @fact (num-1)   
in   
    fact(5) // equals 120  

Palavra-chave each

A palavra-chave each é usada para criar facilmente funções simples. "each…" é uma simplificação sintática para uma assinatura de função que usa o _ parâmetro "(_) => ..."

Each é útil quando combinada ao operador lookup, que é aplicado por padrão a _
Por exemplo, each [CustomerID] é o mesmo que each _[CustomerID], que é o mesmo que (_) => _[CustomerID]

Exemplo – usando each um no filtro de linha de tabela

Table.SelectRows(  
      Table.FromRecords({  
            [CustomerID = 1, Name = "Bob", Phone = "123-4567"],  
            [CustomerID = 2, Name = "Jim", Phone = "987-6543"] ,  
            [CustomerID = 3, Name = "Paul", Phone = "543-7890"] ,  
            [CustomerID = 4, Name = "Ringo", Phone = "232-1550"]  
      }),   
      each [CustomerID] = 2  
)[Name]  
  
// equals "Jim"