Descripción de las funciones de M de Power Query

En el lenguaje de fórmulas M de Power Query, una función es una asignación de un conjunto de valores de entrada a un único valor de salida. Para escribir una función, primero se indican los parámetros de esa función y, después, se proporciona una expresión para calcular el resultado de la función. El cuerpo de la función va detrás del signo igual (=>). Opcionalmente, se puede incluir información de tipo en los parámetros y en el valor devuelto de la función. Una función se define y se invoca en el cuerpo de una instrucción let. Los parámetros y/o el valor devuelto pueden ser implícitos o explícitos. Los parámetros y/o valor devuelto implícitos son de tipo any. Escribir any es similar a un tipo de objeto en otros lenguajes. Todos los tipos de M se derivan del tipo any.

Una función es un valor, como un número o un valor de texto, y se puede incluir en línea, como cualquier otra expresión. En el siguiente ejemplo se muestra una función que corresponde al valor de una variable Add que se invoca, o se ejecuta, desde otras variables. Cuando una función se invoca, se especifica un conjunto de valores que se sustituyen lógicamente por el conjunto necesario de valores de entrada dentro de la expresión del cuerpo de la función.

Ejemplo: parámetros y valor devuelto explícitos

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

Ejemplo: parámetros y valor devuelto implícitos

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

Hallar el primer elemento de una lista mayor que 5 o, en caso contrario, NULL

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  

Las funciones se pueden usar de forma recursiva. Para hacer referencia de forma recursiva a una función, anteponga @ al identificador.

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

Palabra clave each

La palabra clave each se usa para crear funciones simples fácilmente. "each..." es el nivel sintáctico de una firma de función que toma el parámetro "(_) => ..."

Each resulta útil cuando se combina con el operador de búsqueda, que se aplica de forma predeterminada a _.
Por ejemplo, cada valor [CustomerID] es igual que cada valor _[CustomerID], que es lo mismo que (_) => _[CustomerID].

Ejemplo: usar each en un filtro de fila de tabla

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"