Funções embutidas (F#)
Funções embutidas são funções que estão integradas diretamente o código de chamada.
Usando funções embutidas
Quando você usa os parâmetros de tipo estático, todas as funções que são parametrizadas pelos parâmetros de tipo devem ser embutido. Isso garante que o que o compilador pode resolvê-los digite parâmetros. Quando você usa os parâmetros comuns de tipo genérico, não há nenhuma restrição.
Diferente de ativar o uso de restrições de membro, funções embutidas podem ser úteis na otimização de código. No entanto, o uso excessivo de funções embutidas pode causar seu código seja menos resistentes a alterações em otimizações do compilador e a implementação das funções de biblioteca. Por esse motivo, você deve evitar usar funções embutidas para otimização, a menos que você tenha tentado todas as outras técnicas de otimização. Tornar um embutido de função ou método, às vezes, pode melhorar desempenho, mas que não é sempre o caso. Portanto, você também deve usar medidas de desempenho para verificar se tornar qualquer in-line determinada função na verdade tem um efeito positivo.
O inline modificador pode ser aplicado às funções de nível superior, no nível de módulo ou no nível do método em uma classe.
O exemplo de código a seguir ilustra uma função embutida no nível superior, um método de instância in-line e um método estático do in-line.
let inline increment x = x + 1
type WrapInt32() =
member inline this.incrementByOne(x) = x + 1
static member inline Increment(x) = x + 1
As funções embutidas e inferência de tipo
A presença de inline afeta a inferência de tipo. Isso ocorre porque o funções embutidas podem resolveram estaticamente parâmetros de tipo, enquanto as funções não embutidas não é possível. O exemplo de código a seguir mostra um caso onde inline é útil porque você está usando uma função que tem um parâmetro de tipo estaticamente resolvido, o float operador de conversão.
let inline printAsFloatingPoint number =
printfn "%f" (float number)
Sem o inline modificador, a inferência de tipo força a função para levar a um tipo específico, nesse caso int. Mas com o inline modificador, a função também é inferido para ter um parâmetro de tipo estaticamente resolvido. Com o inline o modificador do tipo é inferido para ser o seguinte:
^a -> unit when ^a : (static member op_Explicit : ^a -> float)
Isso significa que a função aceita qualquer tipo que ofereça suporte a uma conversão de float.