Debe usar en línea cuando necesite definir una función que debe tener su tipo (re) evaluado en el sitio de cada uso, en oposición a una función normal, que tendrá su tipo evaluado (inferido) solo en el el sitio del primer uso, y luego se considera que está tipificado estáticamente con esa primera firma de tipo inferido en cualquier otro lugar a partir de entonces.
En el caso en línea, la definición de la función es efectivamente genérica/polimórfica, mientras que en el caso normal (ninguno en línea), la función se escribe estáticamente (y a menudo implícitamente).
Por lo tanto, si se utiliza en línea, el siguiente código:
let inline add a b = a + b
[<EntryPoint>]
let main args =
let one = 1
let two = 2
let three = add one two
// here add has been compiled to take 2 ints and return an int
let dog = "dog"
let cat = "cat"
let dogcat = add dog cat
// here add has been compiled to take 2 strings and return a string
printfn "%i" three
printfn "%s" dogcat
0
edificaré, y compilar para producir el siguiente resultado:
3
dogcat
En otras palabras, la definición misma función complemento tiene se ha utilizado para producir una función que se suma a enteros, y una función que concatena dos cadenas (de hecho, la sobrecarga del operador subyacente en + también se logra debajo del capó usando en línea).
Considerando que el presente código, idénticos excepto en línea que la función de complemento ya no se declara:
let add a b = a + b
[<EntryPoint>]
let main args =
let one = 1
let two = 2
let three = add one two
// here add has been compiled to take 2 ints and return an int
let dog = "dog"
let cat = "cat"
let dogcat = add dog cat
// since add was not declared inline, it cannot be recompiled
// and so we now have a type mismatch here
printfn "%i" three
printfn "%s" dogcat
0
no se compilará, en su defecto con esta queja:
let dogcat = add dog cat
^^^ - This expression was expected to have type int
but instead has type string
Un buen ejemplo de cómo el uso en línea es apropiado, es cuando se quiere definir una función genérica para invertir el orden de la aplicación de argumentos de una función con 2 argumentos, por ejemplo
let inline flip f x y = f y x
como se hace en la respuesta de @pad a esta pregunta Different argument order for getting N-th element of Array, List or Seq.
Lo siento pero estoy empezando a aprender F # y no entiendo en absoluto su respuesta, ¿puede decirme alguna URL donde se explican los conceptos que utilizó? – knocte
'' p: 'a'' - requiere que '' p'' sea un descendiente del tipo ''' a'' como '' int'', '' obj'', '' 'a cuando' a: > SomeBaseType'', etc. Por otro lado, '' p:^a'' - requiere que '' p'' sea un tipo que admita algunas características o subtipos en los puntos de invocación en el código haciéndolo directamente o al abrir un módulo de soporte o acceder a una clase de métodos de extensión, etc. – George