F# (pronunciado F sharp ) es un lenguaje de programación de propósito general , de alto nivel , fuertemente tipado y multiparadigma que abarca métodos de programación funcional , imperativa y orientada a objetos . Se utiliza con mayor frecuencia como lenguaje de la Infraestructura de Lenguaje Común (CLI) multiplataforma en .NET , pero también puede generar JavaScript [ 8 ] y código para unidades de procesamiento gráfico (GPU) [ 9 ] .
F# es desarrollado por la F# Software Foundation , [ 10 ] Microsoft y colaboradores de código abierto. Un compilador multiplataforma de código abierto para F# está disponible en la F# Software Foundation. [ 11 ] F # es un lenguaje totalmente compatible con Visual Studio [ 12 ] y JetBrains Rider . [ 13 ] Existen complementos que admiten F# para muchos editores ampliamente utilizados, incluidos Visual Studio Code , Vim y Emacs .
F# es un miembro de la familia de lenguajes ML y se originó como una implementación de .NET Framework de un núcleo del lenguaje de programación OCaml . [ 5 ] [ 6 ] También ha sido influenciado por C# , Python , Haskell , [ 4 ] Scala y Erlang .
Historia
Versiones
evolución del lenguaje
F# utiliza un proceso de desarrollo e ingeniería abierto. Don Syme, de Microsoft Research, es el responsable vitalicio del diseño del lenguaje, junto con la F# Software Foundation. Las versiones anteriores de F# fueron diseñadas por Microsoft y Microsoft Research mediante un proceso de desarrollo cerrado.
F# se incluyó por primera vez en Visual Studio en la edición de 2010 , al mismo nivel que Visual Basic (.NET) y C# (aunque como opción), y permanece en todas las ediciones posteriores, lo que hace que el lenguaje esté ampliamente disponible y cuente con un buen soporte.
F# tiene su origen en Microsoft Research, Cambridge, Reino Unido. El lenguaje fue diseñado e implementado originalmente por Don Syme , [ 5 ] según quien en el equipo de fsharp, dicen que la F es de "Fun" (diversión). [ 41 ] Andrew Kennedy contribuyó al diseño de las unidades de medida. [ 5 ] Las herramientas Visual F# para Visual Studio son desarrolladas por Microsoft. [ 5 ] La F# Software Foundation desarrolló el compilador y las herramientas de código abierto de F#, incorporando la implementación del compilador de código abierto proporcionada por el equipo de Microsoft Visual F# Tools. [ 10 ]
Descripción general del idioma
Programación funcional
F# es un lenguaje funcional fuertemente tipado con una gran cantidad de capacidades que normalmente solo se encuentran en lenguajes de programación funcional , a la vez que admite las características de la programación orientada a objetos disponibles en C#. En conjunto, estas características permiten escribir programas en F# con un estilo completamente funcional y también permiten combinar estilos funcionales y orientados a objetos.
Ejemplos de características funcionales son:
- Todo es una expresión
- Inferencia de tipos (utilizando la inferencia de tipos de Hindley-Milner )
- Funciona como ciudadanos de primera clase
- Funciones anónimas con semántica de captura (es decir, cierres )
- Variables y objetos inmutables
- Soporte de evaluación perezoso
- Funciones de orden superior
- Funciones anidadas
- Zurra
- Coincidencia de patrones
- Tipos de datos algebraicos
- Tuplas
- Comprensión de listas
- Soporte para patrones de mónadas (denominado expresiones de computación [ 53 ] )
- Optimización de llamadas de cola [ 54 ]
F# es un lenguaje basado en expresiones que utiliza evaluación estricta y, en algunos casos, evaluación perezosa . Cada instrucción en F#, incluidas iflas expresiones, trylas expresiones y los bucles, es una expresión componible con un tipo estático. [ 55 ] Las funciones y expresiones que no devuelven ningún valor tienen un tipo de retorno de unit. F# utiliza la letpalabra clave para vincular valores a un nombre. [ 55 ] Por ejemplo:
Sea x = 3 + 4vincula el valor 7al nombre x.
Los nuevos tipos se definen usando la typepalabra clave. Para la programación funcional, F# proporciona los tipos tupla , registro , unión discriminada , lista , opción y resultado . [ 55 ] Una tupla representa un conjunto de n valores, donde n ≥ 0. El valor n se llama aridad de la tupla. Una 3-tupla se representaría como (A, B, C), donde A, B y C son valores de tipos posiblemente diferentes. Una tupla se puede usar para almacenar valores solo cuando el número de valores se conoce en tiempo de diseño y permanece constante durante la ejecución.
Un registro es un tipo de dato cuyos miembros tienen nombre. Aquí hay un ejemplo de definición de registro:
tipo R = { Nombre : cadena Edad : entero }Los registros se pueden crear como . La palabra clave se utiliza para crear una copia de un registro, como en , que crea un nuevo registro copiando y cambiando el valor del campo (suponiendo que el registro creado en el último ejemplo se llamaba ).letr={Name="AB";Age=42}with{rwithName="CD"}rNamer
Un tipo de unión discriminada es una versión segura en cuanto a tipos de las uniones de C. Por ejemplo,
tipo A = | UnionCaseX de cadena | UnionCaseY de enteroLos valores del tipo de unión pueden corresponder a cualquiera de los casos de unión. Los tipos de los valores que contiene cada caso de unión se incluyen en la definición de cada caso.
El tipo de lista es una lista enlazada inmutable representada mediante una notación ( es el operador cons ) o una notación abreviada como . Una lista vacía se escribe . El tipo de opción es un tipo de unión discriminada con opciones o . Los tipos de F# pueden ser genéricos , implementados como tipos genéricos de .NET.head::tail::[item1;item2;item3][]Some(x)None
F# admite funciones lambda y cierres . [ 55 ] Todas las funciones en F# son valores de primera clase e inmutables. [ 55 ] Las funciones pueden currificarse . Al ser valores de primera clase, las funciones pueden pasarse como argumentos a otras funciones. Al igual que otros lenguajes de programación funcional, F# permite la composición de funciones mediante los operadores >>`and` .<<
F# proporcionaexpresiones de secuencia [ 56 ] que definen una secuenciaseq { ... }, lista[ ... ]o matriz[| ... |]a través de código que genera valores. Por ejemplo,
secuencia { para b en 0 .. 25 hacer si b < 15 entonces generar b * b }Se forma una secuencia de cuadrados de números del 0 al 14 filtrando los números del rango del 0 al 25. Las secuencias son generadores : los valores se generan bajo demanda (es decir, se evalúan de forma diferida ), mientras que las listas y los arreglos se evalúan de forma inmediata.
F# utiliza la coincidencia de patrones para vincular valores a nombres. La coincidencia de patrones también se utiliza al acceder a uniones discriminadas: la unión se compara con las reglas del patrón y se selecciona una regla cuando hay una coincidencia. F# también admite patrones activos como una forma de coincidencia de patrones extensible. [ 57 ] Se utiliza, por ejemplo, cuando existen múltiples formas de coincidencia en un tipo. [ 55 ]
F# admite una sintaxis general para definir cálculos compositivos llamadoexpresiones de cálculo . Las expresiones de secuencia, los cálculos asíncronos y las consultas son tipos particulares de expresiones de cálculo. Las expresiones de cálculo son una implementación delmónada. [ 56 ]
Programación imperativa
El soporte de F# para la programación imperativa incluye:
forbucleswhilebucles- matrices , creadas con la
[| ... |]sintaxis - tabla hash , creada con la
dict [ ... ]sintaxis oSystem.Collections.Generic.Dictionary<_,_>el tipo.
Los valores y los campos de registro también pueden etiquetarse como mutable. Por ejemplo:
// Definir 'x' con valor inicial '1' let mutable x = 1 // Cambiar el valor de 'x' a '3' x <- 3Además, F# admite el acceso a todos los tipos y objetos de la CLI, como los definidos en el System.Collections.Genericespacio de nombres que define las estructuras de datos imperativas.
Programación orientada a objetos
Al igual que otros lenguajes de Common Language Infrastructure (CLI), F# puede usar tipos CLI a través de la programación orientada a objetos. [ 55 ] El soporte de F# para la programación orientada a objetos en expresiones incluye:
- Notación de puntos, por ejemplo,
x.Name - Expresiones de objetos, por ejemplo,
{newobj()withmemberx.ToString()="hello"} - Construcción de objetos, por ejemplo,
newForm() - Pruebas de tipo, por ejemplo,
x:?string - Coerciones de tipo, por ejemplo,
x:?>string - Argumentos con nombre, por ejemplo,
x.Method(someArgument=1) - Setters con nombre, por ejemplo,
newForm(Text="Hello") - Argumentos opcionales, por ejemplo,
x.Method(OptionalArgument=1)
El soporte para la programación orientada a objetos en patrones incluye:
- Pruebas de tipo, por ejemplo,
:?stringass - Patrones activos, que pueden definirse sobre tipos de objetos [ 57 ]
Las definiciones de tipo de objeto en F# pueden ser de tipo clase, estructura, interfaz, enumeración o delegado, correspondientes a las formas de definición que se encuentran en C# . Por ejemplo, aquí hay una clase con un constructor que recibe un nombre y una edad, y declara dos propiedades.
/// Definición de un tipo de objeto simple: tipo Persona ( nombre : cadena , edad : entero ) = miembro x . Nombre = nombre miembro x . Edad = edadProgramación asíncrona
F# admite la programación asíncrona a través de flujos de trabajo asíncronos . [ 58 ] Un flujo de trabajo asíncrono se define como una secuencia de comandos dentro de un async{ ... }, como en
let asynctask = async { let req = WebRequest . Create ( url ) let! response = req . GetResponseAsync () use stream = response . GetResponseStream () use streamreader = new System . IO . StreamReader ( stream ) return streamreader . ReadToEnd () }Esto let!indica que la expresión de la derecha (obtener la respuesta) debe ejecutarse de forma asíncrona, pero el flujo solo debe continuar cuando el resultado esté disponible. En otras palabras, desde el punto de vista del bloque de código, es como si obtener la respuesta fuera una llamada bloqueante, mientras que desde el punto de vista del sistema, el hilo no se bloqueará y podrá utilizarse para procesar otros flujos hasta que el resultado necesario para este esté disponible.
El bloque asíncrono puede invocarse mediante la Async.RunSynchronouslyfunción. Se pueden ejecutar varios bloques asíncronos en paralelo mediante la Async.Parallelfunción que toma una lista de asyncobjetos (en el ejemplo, asynctaskes un objeto asíncrono) y crea otro objeto asíncrono para ejecutar las tareas de las listas en paralelo. El objeto resultante se invoca mediante Async.RunSynchronously. [ 58 ]
La inversión de control en F# sigue este patrón. [ 58 ]
Desde la versión 6.0, F# admite la creación, el consumo y la devolución directa de tareas .NET. [ 59 ]
open System.Net.Http let fetchUrlAsync ( url : string ) = // string -> Task<string> task { use client = new HttpClient () let! response = client . GetAsync ( url ) let! content = response . Content . ReadAsStringAsync () do ! Task . Delay 500 return content }// Uso let fetchPrint () = let task = task { let! data = fetchUrlAsync "https://example.com" printfn $ "{data}" } task . Wait ()Programación paralela
La programación paralela se admite en parte a través de Async.Parallely Async.Startotras operaciones que ejecutan bloques asíncronos en paralelo.
La programación paralela también es compatible a través de los Array.Paralleloperadores de programación funcional en la biblioteca estándar de F#, el uso directo del System.Threading.Tasksmodelo de programación de tareas, el uso directo del grupo de subprocesos de .NET y los subprocesos de .NET y a través de la traducción dinámica del código F# a motores de ejecución paralela alternativos como el código GPU [ 9 ] .
Unidades de medida
El sistema de tipos de F# admite la comprobación de unidades de medida para números: [ 60 ] las unidades de medida, como metros o kilogramos, se pueden asignar a valores de punto flotante, enteros sin signo [ 61 ] y enteros con signo. Esto permite al compilador comprobar que la aritmética que involucra estos valores es dimensionalmente consistente, lo que ayuda a prevenir errores de programación comunes al garantizar que, por ejemplo, las longitudes no se sumen erróneamente a las horas.
La función de unidades de medida se integra con la inferencia de tipos de F# para requerir anotaciones de tipo mínimas en el código del usuario. [ 62 ]
[< Medida >] tipo m // metro [< Medida >] tipo s // segundosea distancia = 100 . 0 < m > // float<m> sea tiempo = 5 . 0 < s > // float<s> sea velocidad = distancia / tiempo // float<m/s>[< Medida >] tipo kg // kilogramo [< Medida >] tipo N = ( kg * m )/( s ^ 2 ) // Newtons [< Medida >] tipo Pa = N /( m ^ 2 ) // Pascales[< Medida >] tipo días let better_age = 3u < días > // uint<días>El verificador de tipos estático de F# proporciona esta funcionalidad en tiempo de compilación, pero las unidades se eliminan del código compilado. Por consiguiente, no es posible determinar la unidad de un valor en tiempo de ejecución.
Metaprogramación
F# permite algunas formas de personalización de la sintaxis mediante metaprogramación para admitir la incrustación de lenguajes específicos de dominio personalizados dentro del lenguaje F#, particularmente a través de expresiones de cálculo. [ 55 ]
F# incluye una característica para la metaprogramación en tiempo de ejecución llamada comillas. [ 63 ] Una expresión de comillas se evalúa a una representación abstracta en forma de árbol sintáctico de las expresiones de F#. De manera similar, las definiciones etiquetadas con el atributo también se pueden acceder en su forma de comillas. Las comillas de F# se utilizan para diversos fines, incluyendo la compilación de código F# a JavaScript [ 8 ] y código GPU [ 9 ] . Las comillas representan sus expresiones de código F# como datos para su uso por otras partes del programa, requiriendo que sea código F# sintácticamente correcto.[<ReflectedDefinition>]
Programación rica en información
F# 3.0 introdujo una forma de metaprogramación en tiempo de compilación mediante la generación de tipos estáticamente extensibles, denominada proveedores de tipos de F#. [ 64 ] Los proveedores de tipos de F# permiten extender el compilador y las herramientas de F# con componentes que proporcionan información de tipos al compilador bajo demanda en tiempo de compilación. Los proveedores de tipos de F# se han utilizado para brindar acceso fuertemente tipado a fuentes de información conectadas de manera escalable, incluyendo el grafo de conocimiento de Freebase . [ 65 ]
En F# 3.0, las características de expresiones de comillas y cálculos de F# se combinan para implementar consultas LINQ . [ 66 ] Por ejemplo:
// Utilice el proveedor de tipos OData para crear tipos que puedan usarse para acceder a la base de datos Northwind. open Microsoft.FSharp.Data.TypeProviderstipo Northwind = ODataService < "http://services.odata.org/Northwind/Northwind.svc" > let db = Northwind . GetDataContext ()// Una expresión de consulta. let query1 = query { for customer in db . Customers do select customer }La combinación de proveedores de tipos, consultas y programación funcional fuertemente tipada se conoce como programación rica en información . [ 67 ]
Programación de agentes
F# admite una variación del modelo de programación de actores mediante la implementación en memoria de agentes asíncronos ligeros. Por ejemplo, el siguiente código define un agente y publica 2 mensajes:
tipo Mensaje = | Encolar cadena | Desencolar AsyncReplyChannel < Opción < cadena >>// Proporciona acceso concurrente a una lista de cadenas let listManager = MailboxProcessor . Start ( fun inbox -> let rec messageLoop list = async { let! msg = inbox . Receive () match msg with | Enqueue item -> return ! messageLoop ( item :: list )| Desencolar replyChannel -> coincidir lista con | [] -> replyChannel . Reply Ninguno devolver ! lista messageLoop | cabeza :: cola -> replyChannel . Reply ( Alguna cabeza ) devolver ! cola messageLoop }// Iniciar el bucle con una lista vacía messageLoop [] )// Uso async { // Encolar algunas cadenas listManager . Post ( Encolar "Hola" ) listManager . Post ( Encolar "Mundo" )// Desencolar y procesar las cadenas let! str = listManager . PostAndAsyncReply ( Dequeue ) str |> Option . iter ( printfn "Dequeued: %s" )} |> Async . StartHerramientas de desarrollo
- Visual Studio , con las herramientas Visual F# de Microsoft instaladas, permite crear, ejecutar y depurar proyectos F#. Estas herramientas incluyen una consola interactiva REPL ( bucle de lectura, evaluación e impresión ) integrada en Visual Studio que ejecuta código F# a medida que se escribe. Visual Studio para Mac también es totalmente compatible con proyectos F#.
- Visual Studio Code incluye soporte completo para F# a través de la extensión Ionide .
- F# se puede desarrollar con cualquier editor de texto. Existe soporte específico en editores como Emacs .
- JetBrains Rider está optimizado para el desarrollo de código F# a partir de la versión 2019.1. [ 68 ]
- LINQPad es compatible con F# desde la versión 2.x.
Comparación de entornos de desarrollo integrados
Áreas de aplicación
F# es un lenguaje de programación de propósito general .
Programación web
SAFE Stack es una pila F# de extremo a extremo para desarrollar aplicaciones web. Utiliza ASP.NET Core en el lado del servidor y Fable en el lado del cliente. [ 71 ]
Entre las alternativas de extremo a extremo para F# se incluyen el framework WebSharper y el framework Oxpecker. [ 72 ]
Desarrollo de aplicaciones multiplataforma
F# se puede usar junto con las herramientas de Visual Studio para Xamarin para desarrollar aplicaciones para iOS y Android . La biblioteca Fabulous proporciona una interfaz funcional más cómoda.
Programación analítica
Entre otros usos, F# se utiliza para la programación de finanzas cuantitativas, [ 73 ] el comercio de energía y la optimización de carteras, [ 74 ] el aprendizaje automático, [ 75 ] la inteligencia empresarial [ 76 ] y los juegos sociales en Facebook . [ 77 ]
En la década de 2010, F# se posicionó como una alternativa optimizada a C# . Su capacidad de scripting y su compatibilidad entre lenguajes con todos los productos de Microsoft lo hicieron popular entre los desarrolladores. [ 78 ]
Programación de scripts
F# se puede utilizar como lenguaje de scripting, principalmente para scripting de bucle de lectura-evaluación-impresión (REPL) de escritorio. [ 79 ]
Comunidad de código abierto
La comunidad de código abierto de F# incluye la F# Software Foundation [ 10 ] y el F# Open Source Group en GitHub . [ 11 ] Algunos proyectos populares de código abierto de F# son:
- Fable , un transpilador de F# a Javascript basado en Babel .
- Paket es un gestor de paquetes alternativo para .NET que aún puede usar repositorios NuGet , pero que cuenta con una gestión de versiones centralizada.
- FAKE , un sistema de compilación compatible con F#.
- Giraffe , un middleware orientado a la funcionalidad para ASP.NET Core .
- Suave , una biblioteca ligera para el desarrollo y el funcionamiento de servidores web.
Compatibilidad
F# incluye un modo de compatibilidad ML heredado que puede compilar directamente programas escritos en un gran subconjunto de OCaml, aproximadamente, sin functores, objetos, variantes polimórficas u otras adiciones.
Ejemplos
A continuación se muestran algunos ejemplos pequeños:
// Este es un comentario para un programa de ejemplo "Hola mundo". printfn "¡Hola mundo!"Definición de un tipo de registro. Los registros son inmutables por defecto y se comparan mediante igualdad estructural.
tipo Persona = { Nombre : cadena Apellido : cadena Edad : entero }// Creando una instancia del registro let person = { FirstName = "John" ; LastName = "Doe" ; Age = 30 }Una clase Persona con un constructor que recibe un nombre, una edad y dos propiedades inmutables.
/// Este es un comentario de documentación para una definición de tipo. type Person ( name : string , age : int ) = member x . Name = name member x . Age = age /// instanciación de clase let mrSmith = Person ( "Smith" , 42 )Un ejemplo sencillo que se usa a menudo para demostrar la sintaxis de los lenguajes funcionales es la función factorial para enteros no negativos de 32 bits, que aquí se muestra en F#:
/// Usando la expresión de coincidencia de patrones let rec factorial n = match n with | 0 -> 1 | _ -> n * factorial ( n - 1 )/// Para funciones de un solo argumento existe azúcar sintáctico (función de coincidencia de patrones): let rec factorial = function | 0 -> 1 | n -> n * factorial ( n - 1 ) /// Usando los operadores fold y range let factorial n = [ 1 .. n ] |> Seq . fold (*) 1Ejemplos de iteración:
/// Iteración usando un bucle 'for' let printList lst = for x in lst do printfn $ "{x}"/// Iteración usando una función de orden superior let printList2 lst = List . iter ( printfn "%d" ) lst/// Iteración usando una función recursiva y coincidencia de patrones let rec printList3 lst = match lst with | [] -> () | h :: t -> printfn "%d" h printList3 tEjemplos de Fibonacci:
/// Fórmula del número de Fibonacci [< TailCall >] sea fib n = sea rec g n f0 f1 = coincida n con | 0 -> f0 | 1 -> f1 | _ -> g ( n - 1 ) f1 ( f0 + f1 ) g n 0 1/// Otro enfoque: una secuencia infinita perezosa de números de Fibonacci let fibSeq = Seq . unfold ( fun ( a , b ) -> Some ( a + b , ( b , a + b ))) ( 0 , 1 )// Imprimir fibs pares [ 1 .. 10 ] |> List . map fib |> List . filter ( fun n -> ( n % 2 ) = 0 ) |> printList// Lo mismo, usando una expresión de lista [ para i en 1 .. 10 hacer que r = fib i si r % 2 = 0 entonces generar r ] |> printListUn ejemplo de programa de Windows Forms:
// Abrir la biblioteca de Windows Forms open System.Windows.Forms// Crea una ventana y establece algunas propiedades let form = new Form ( Visible = true , TopMost = true , Text = "Bienvenido a F#" )// Crea una etiqueta para mostrar algún texto en el formulario let label = let x = 3 + ( 4 * 5 ) new Label ( Text = $ "{x}" )// Agrega la etiqueta al formulario . Formulario . Controles . Agregar ( etiqueta )// Finalmente, ejecuta el formulario [< System . STAThread >] Application . Run ( formulario )Ejemplo de programación paralela asíncrona (tareas paralelas de CPU y E/S):
/// Un detector simple de números primos let isPrime ( n : int ) = let bound = int ( sqrt ( float n )) seq { 2 .. bound } |> Seq . forall ( fun x -> n % x <> 0 )// Estamos usando flujos de trabajo asíncronos let primeAsync n = async { return ( n , isPrime n ) }/// Devuelve números primos entre m y n usando múltiples hilos let primes m n = seq { m .. n } |> Seq . map primeAsync |> Async . Parallel |> Async . RunSynchronously |> Array . filter snd |> Array . map fst// Ejecutar una prueba de números primos 1000000 1002000 |> Array . iter ( printfn "%d" )Véase también
Notas
- ↑ https://learn.microsoft.com/en-us/dotnet/fsharp/whats-new/fsharp-10 .
{{cite web}}: Falta o está vacío|title=( ayuda ) - ↑ "Licencia de la F# Software Foundation" . GitHub . 14 de octubre de 2021.
- ↑ "Licencia F# de Microsoft" . GitHub . 16 de octubre de 2021.
- ^ Syme , Granicz y Cisternino (2007 :2)
- 1 2 3 4 5 "Agradecimientos históricos de F#" . Microsoft .
- 1 2 Syme, Don (2006). "Aprovechando los componentes de metaprogramación de .NET desde F#" .
[F#] tiene sus raíces en el diseño de Core ML y, en particular, tiene un lenguaje central en gran medida compatible con el de OCaml.
- ↑ para asíncrono
- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 The F# Software Foundation. "Uso de F# para aplicaciones web" . Consultado el 30 de julio de 2020 .
- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 The F# Software Foundation. "Uso de F# para programación de GPU" . Archivado del original el 25/12/2019 . Recuperado el 25/12/2019 .
- 1 2 3 La Fundación de Software F#. "La Fundación de Software F#" . Consultado el 24 de noviembre de 2012 .
- 1 2 The F# Software Foundation. "Compilador F# (edición de código abierto) @ github" . Archivado del original el 17 de mayo de 2013. Recuperado el 24 de noviembre de 2012 .
- ↑ "Desarrollar con Visual F# en Visual Studio" . Consultado el 30 de julio de 2020 .
- ↑ "F#" . Consultado el 30 de julio de 2020 .
- ↑ Syme, Don. "F# 1.0.8 lanzado" . Microsoft . Consultado el 7 de septiembre de 2014 .
- ↑ Syme, Don. "F# 2.0 se lanza como parte de Visual Studio 2010" . Microsoft . Consultado el 7 de septiembre de 2014 .
- ↑ Zander, Jason. "Visual Studio 2012 y .NET Framework 4.5 se lanzan en la web" . Microsoft . Consultado el 7 de septiembre de 2014 .
- ↑ "Visual Studio 2013 lanzado para la web" . Microsoft. 17 de octubre de 2013. Consultado el 7 de septiembre de 2014 .
- ↑ "Anuncio de la versión final de Visual F# 4.0" . Microsoft . Consultado el 15 de septiembre de 2015 .
- ↑ "Anuncio de F# 4.1 y las herramientas Visual F# para Visual Studio 2017" . Consultado el 8 de marzo de 2017 .
- ↑ "Anuncio de F# 4.5" . Microsoft. 14 de agosto de 2018. Consultado el 14 de agosto de 2018 .
- ↑ "FSharp.Core 4.5.0" .
- ↑ "Descargar .NET Core 2.1 (Linux, macOS y Windows)" . Microsoft . Consultado el 13 de mayo de 2021 .
- ↑ "Anuncio de F# 4.6" . Microsoft. 29 de marzo de 2019. Consultado el 29 de marzo de 2019 .
- ↑ "FSharp.Core 4.6.0" .
- ↑ "Descargar .NET Core 2.2 (Linux, macOS y Windows)" . Microsoft . Consultado el 13 de mayo de 2021 .
- ↑ "Anuncio de F# 4.7" . Microsoft. 23 de septiembre de 2019. Consultado el 23 de septiembre de 2019 .
- ↑ "FSharp.Core 4.7.0" .
- ↑ "Descargar .NET Core 3.0 (Linux, macOS y Windows)" . Microsoft . Consultado el 13 de mayo de 2021 .
- 1 2 "Anuncio de F# 5" . 10 de noviembre de 2020.
- ↑ "Descargar .NET 5.0 (Linux, macOS y Windows)" . Microsoft . Consultado el 13 de mayo de 2021 .
- ↑ "¡F# 6 ya está aquí oficialmente!" 9 de noviembre de 2021.
- ↑ "Descargar .NET 6.0 (Linux, macOS y Windows)" . Microsoft . Consultado el 14 de noviembre de 2021 .
- ↑ "Anuncio de F# 7" . 8 de noviembre de 2022.
- ↑ "Descargar .NET 7.0 (Linux, macOS y Windows)" . Microsoft . Consultado el 8 de noviembre de 2022 .
- ↑ "Anuncio de F# 8" . 14 de noviembre de 2023.
- ↑ "Descargar .NET 8.0 (Linux, macOS y Windows)" . Microsoft . Consultado el 14 de noviembre de 2023 .
- ↑ "Novedades en F# 9" . 12 de noviembre de 2024.
- ↑ "Descargar .NET 9.0 (Linux, macOS y Windows)" . Microsoft . Consultado el 13 de enero de 2025 .
- 1 2 "Novedades en F# 10" .
- ↑ "Descargar .NET 10.0" .
- ↑ Edwards, Kathryn (23 de diciembre de 2008). "El AZ de los lenguajes de programación: F#" . Network World . IDG. Archivado del original el 13 de noviembre de 2018. Recuperado el 8 de agosto de 2016 .
- ↑ McNamara, Brian. "Más información sobre las características del lenguaje F# 3.0" . Microsoft . Consultado el 7 de septiembre de 2014 .
- ↑ McNamara, Brian. "Anuncio de una versión preliminar de F# 3.1" . Microsoft . Consultado el 7 de septiembre de 2014 .
- ↑ "Anuncio de la versión final de Visual F# 4.0" . Consultado el 8 de marzo de 2017 .
- ↑ "Anuncio de F# 4.1 y las herramientas Visual F# para Visual Studio 2017" . Consultado el 8 de marzo de 2017 .
- ↑ "Anuncio de F# 4.7" . 23 de septiembre de 2019.
- ↑ "Anuncio de F# 5" . 10 de noviembre de 2020.
- ↑ "Novedades en F# 6 - Guía de F#" . 10 de marzo de 2023.
- ↑ "Anuncio de F# 7" . 8 de noviembre de 2022.
- ↑ "Anuncio de F# 8" . 14 de noviembre de 2023.
- ↑ "Simplificando los cálculos en F# con la nueva palabra clave 'while!'"" . 20 de septiembre de 2023.
- ↑ "Novedades en F# 9" . 12 de noviembre de 2024.
- ↑ "Expresiones de programación/computación en F# - Wikibooks, libros abiertos para un mundo abierto" . en.wikibooks.org . Consultado el 21 de enero de 2022 .
- ↑ kexugit (8 de julio de 2011). "Llamadas recursivas en F#" . docs.microsoft.com . Consultado el 22 de abril de 2022 .
- 1 2 3 4 5 6 7 8 "Descripción general del lenguaje F#" (PDF) . Consultado el 14 de diciembre de 2007 .
- 1 2 "Algunos detalles sobre las expresiones de cálculo de F#" . Consultado el 14 de diciembre de 2007 .
- 1 2 "Coincidencia de patrones en F# Parte 2 : Patrones activos" . Archivado del original el 09-12-2012 . Recuperado el 24-11-2012 .
- 1 2 3 "Introducción a los flujos de trabajo asíncronos de F#" . Consultado el 14 de diciembre de 2007 .
- ↑ "Expresiones de tarea" . 19 de abril de 2022. Consultado el 15 de enero de 2023 .
- ↑ "Unidades de medida (F#)" . Consultado el 24/11/2012 .
- ↑ "Ampliar las unidades de medida para incluir más tipos numéricos" . GitHub .
- ↑ "Unidades de medida en F#: Primera parte, Introducción a las unidades" . Consultado el 24 de noviembre de 2012 .
- ↑ "Citas de código (F#)" . Consultado el 24/11/2012 .
- ↑ "Proveedores de tipos" . Consultado el 24 de noviembre de 2012 .
- ↑ "Nuevo informe tecnológico de Microsoft Research: Compatibilidad con lenguajes fuertemente tipados para fuentes de información a escala de Internet" . Consultado el 24 de noviembre de 2012 .
- ↑ "Expresiones de consulta (F#)" . Consultado el 24/11/2012 .
- ↑ "F# 3.0 – LINQ + Proveedores de tipos = Programación rica en información" . Consultado el 24 de noviembre de 2012 .
- ↑ Alexander Kurakin (15 de marzo de 2019). "¡Rider 2019.1 inicia su programa de acceso anticipado!" .
- ↑ "Usar F# en Windows" . F# Software Foundation . Consultado el 7 de agosto de 2018 .
- ↑ "Características – Rider" . JetBrains . Consultado el 7 de agosto de 2018 .
- ↑ "Fable: ¡JavaScript del que puedes estar orgulloso!" . fable.io . Consultado el 09-12-2017 .
- ↑ Intellifactory. "Página principal de WebSharper" . Consultado el 24 de noviembre de 2012 .
- ↑ "Estudios de caso de Microsoft: Microsoft Visual Studio 2012 - Empresa de servicios financieros" . Microsoft . Consultado el 25 de noviembre de 2012 .
- ↑ "F# para la optimización de carteras y el comercio de energía" . Consultado el 25 de noviembre de 2012 .
- ↑ "Estudio de caso de Microsoft: Grange Insurance" . Microsoft . Consultado el 25 de noviembre de 2012 .
- ↑ Trelford, Phil (2007). "Aprendiendo con F#" . Actas del 4.º taller ACM SIGPLAN sobre usuarios comerciales de programación funcional - CUFP '07 . págs. 1-2 . doi : 10.1145/1362702.1362709 . ISBN 9781450378444. S2CID 24018363 . Consultado el 25-11-2012 .
- ↑ "Trabajo de F# en juegos sociales de Facebook" . Consultado el 25 de noviembre de 2012 .
- ↑ "Testimonios de desarrolladores de F#" . Consultado el 25 de mayo de 2021 .
- ↑ "Scripting in F#" . 12 de septiembre de 2008. Consultado el 17 de enero de 2020 .
Referencias
- Syme, Don ; Granicz, Adam; Cisternino, Antonio (2007), Experto F# , Apress
- Harrop, Jon (2010), Visual F# 2010 para computación técnica , Flying Frog Consultancy
- Pickering, Robert (2007), Fundamentos de F# , Apress
- Smith, Chris (2009), Programación en F# , O'Reilly
- Petricek, Tomas (2009), Programación funcional en el mundo real con ejemplos en F# y C# , Manning Publications
- Hansen, Michael; Rischel, Hans (2013), Programación funcional con F# , Cambridge University Press
- Astborg, Johan (2013), F# para finanzas cuantitativas , Packt Publishing
- Lundin, Mikael (2015), Pruebas con F# , Packt Publishing
Enlaces externos
- Sitio web oficial de la Fundación de Software F#
- El grupo de código abierto de F# en GitHub se archivó el 17 de mayo de 2013 en Wayback Machine.
- El Centro de desarrolladores de Visual F# se archivó el 19 de noviembre de 2008 en Wayback Machine.
- Prueba F# para aprender F# en un navegador web.
- Sitio de fragmentos de código F#
- El blog del equipo de Visual F#
- El sitio web original de Microsoft Research para F#
- La guía de supervivencia de F#, diciembre de 2009 (libro en línea)
- Especificación del lenguaje F#
- Introducción a la programación en F#. Archivado el 13 de julio de 2011 en Wayback Machine.
- Un tutorial que muestra el proceso para llegar a un diseño funcional; incluye pruebas y codificación paralela.
- Lenguajes de programación .NET
- Software libre multiplataforma
- Lenguajes de programación de alto nivel
- Lenguajes funcionales
- Software gratuito de Microsoft
- Lenguajes de programación de Microsoft
- Investigación de Microsoft
- Familia de lenguajes de programación ML
- Familia de lenguajes de programación OCaml
- Lenguajes de programación que coinciden con patrones
- Lenguajes de programación creados en 2005
- Lenguajes de programación que admiten unidades de medida
- Software que utiliza la licencia Apache.
- Software que utiliza la licencia MIT.
- Lenguajes de programación de tipado estático