¿Por qué F#?
(batsov.com)- F# es un lenguaje funcional de la familia ML que apunta a .NET y fue desarrollado por Microsoft. En comparación con C#, que es principalmente orientado a objetos, F# se enfoca en el paradigma de programación funcional
- Este artículo resume las características del lenguaje F#, su ecosistema, el estado de su documentación, herramientas de desarrollo, casos de uso, situación de la comunidad y F# vs. OCaml
¿Qué es F#?
- F# es un lenguaje de programación de propósito general para escribir código conciso, robusto y de buen rendimiento
- Fue diseñado para que puedas concentrarte en resolver problemas, sin preocuparte por una sintaxis compleja
- Es de código abierto, multiplataforma y tiene alta compatibilidad con .NET
-
Características
- Sintaxis ligera e inmutabilidad por defecto
- Inferencia y generalización de tipos
- Funciones de primera clase, tipos de datos potentes y pattern matching
- Soporte para programación asíncrona (Async)
- Es el lenguaje de origen del famoso operador de tubería (
|>)
-
Código de ejemplo simple
open System let names = [ "Peter"; "Julia"; "Xi" ] let getGreeting name = $"Hello, {name}" names |> List.map getGreeting |> List.iter (printfn "%s") - F# comenzó como un lenguaje creado por Don Syme en Microsoft Research en 2005
- Partió de un proyecto de investigación para portar OCaml a la plataforma .NET (Caml.NET)
- Después se incorporó como producto oficial desde 2010, y en 2024 se lanzó F# 9.0
- En 2025 ya se posiciona como un lenguaje maduro que celebra su 20.º aniversario
- Principales razones para probar F#
- Confirmar cómo .NET evolucionó hacia el código abierto y lo multiplataforma
- Comparar ventajas y desventajas frente a OCaml
- Evaluaciones positivas sobre herramientas como Rider e Ionide
- Interés por explorar un lenguaje por simple curiosidad
F# como lenguaje
- F# es un lenguaje funcional de la familia ML con una sintaxis familiar para quienes usan OCaml
- Los desarrolladores con experiencia en Haskell o Lisp también pueden adaptarse con facilidad
- Su estructura sintáctica se basa en espacios en blanco, así que, como en Python, la indentación es importante a nivel gramatical
- Está diseñado para que incluso principiantes puedan aprender rápido la sintaxis básica
-
Resumen de características del lenguaje
- La definición y aplicación de funciones puede expresarse de manera concisa y natural
- Condicionales, bucles, tuplas y manejo de listas pueden usarse limpiamente con estilo funcional
- Registros, uniones discriminadas (Discriminated Union) y pattern matching permiten manejar estructuras de datos complejas de forma concisa
- Con el operador de tubería (
|>), el flujo de datos puede organizarse visualmente con claridad como una conexión de funciones - F# es muy adecuado para escribir scripts ad hoc; pueden escribirse en archivos
.fsxy ejecutarse de inmediato condotnet fsi - También ofrece un entorno REPL, favorable para la programación exploratoria
-
Sintaxis amigable para el usuario
- Incluye funciones sintácticas prácticas como comentarios de una y varias líneas, variables
mutabley slices de listas - Gracias a su alta compatibilidad con C#, es fácil usar APIs de .NET
- También soporta de forma natural sobrecarga de operadores para distintos tipos
- Con
printfnes fácil imprimir distintos tipos, lo que resulta útil para depuración y logging
- Incluye funciones sintácticas prácticas como comentarios de una y varias líneas, variables
-
Pionero de la programación asíncrona
- El patrón
async/awaitse originó en F# 2.0, y después influyó en C#, JavaScript y otros lenguajes - F# ofrece una estructura que permite implementar programación asíncrona de forma intuitiva sin callbacks
- El flujo del código se lee como si fuera síncrono, aunque en realidad funciona de manera asíncrona
- El patrón
-
Inversión de Microsoft y evolución del lenguaje
- Durante mucho tiempo, Microsoft asignó recursos limitados a F#, pero en 2022 formó un equipo dedicado en Praga e inició una inversión más seria
- Con los lanzamientos de F# 8.0 y 9.0, el lenguaje y las herramientas están mejorando rápidamente
- A medida que aumenta el interés interno en Microsoft, también crecen las expectativas sobre su potencial de evolución futura
F# es un lenguaje práctico, fácil de aprender y con un sistema de tipos potente junto con el paradigma de programación funcional; en particular, es una opción muy atractiva para desarrolladores que quieren introducir un enfoque funcional en proyectos basados en .NET
Ecosistema (Ecosystem)
- Tras usar F# durante un período relativamente corto, la conclusión es que no hay tantas librerías o frameworks dedicados exclusivamente a F#
- La mayoría de los usuarios dependen de las APIs base de .NET y librerías de terceros diseñadas principalmente pensando en C#
- Esto es algo común en lenguajes alojados (hosted language) como Scala, Clojure o Groovy
-
Principales librerías para desarrollo web
- Giraffe: framework web ligero basado en ASP.NET Core, orientado a un estilo funcional
- Suave: framework simple de servidor web con estilo combinator para routing y composición de tareas
- Saturn: framework de estilo MVC construido sobre Giraffe, inspirado en Ruby on Rails y Phoenix
- Bolero: framework para desarrollo de aplicaciones cliente basado en WebAssembly y Blazor
- Fable: transpila F# a JavaScript y permite integrarlo con el ecosistema JS como React y Node.js
- Elmish: framework de UI basado en el patrón MVU (Model-View-Update), usado con frecuencia junto con Fable
- SAFE Stack: stack funcional de desarrollo web end-to-end que combina Saturn, Fable, Elmish, Azure, etc.
-
Principales librerías para ciencia de datos
- Deedle: librería de análisis y manipulación de datos al estilo pandas
- DiffSharp: librería centrada en matemáticas que ofrece machine learning y diferenciación automática
- FsLab: toolkit integrado para ciencia de datos que incluye visualización, análisis estadístico y más
Estado de la documentación
- La documentación oficial en general está bien organizada y es de alta calidad
- Parte está en Microsoft Docs y otra parte en F# Software Foundation
- La estructura de la documentación puede sentirse algo dispersa, pero la guía de estilo del lenguaje, documentos de diseño y la API de la librería estándar son muy útiles
-
Enlaces de documentación recomendados
-
Materiales comunitarios de aprendizaje
- F# for Fun and Profit: colección de tutoriales y ensayos (algo antigua, pero todavía vigente)
Herramientas de desarrollo (Dev Tooling)
- El ecosistema de herramientas de desarrollo para F# antes estaba optimizado casi exclusivamente para Visual Studio, y el soporte para otros editores era limitado
- Por suerte, en los últimos 10 años el entorno de herramientas ha mejorado mucho
-
Punto de inflexión técnico: FSharp.Compiler.Service (FCS)
- FCS es una librería única que incluye el compilador de F#, funciones de soporte para editores y un motor de scripting, haciendo posible usar F# en distintos editores y entornos de tooling
- Gracias a esto, fue posible habilitar soporte de F# en VS Code, generadores de documentación y backends alternativos, impulsando la expansión del ecosistema
- Un ejemplo representativo es Ionide, que ofrece soporte muy completo para F# en VS Code y ya superó 1 millón de descargas
-
Editores probados
- Emacs (
fsharp-mode): ofrece funciones básicas, no soporta TreeSitter y tiene poca actividad de desarrollo - Zed: el soporte para F# es limitado
- Helix: tiene soporte básico
- VS Code (plugin Ionide): uno de los entornos más completos
- JetBrains Rider: IDE comercial, pero con soporte muy potente para F#
La mayoría de las funciones operan sobre el servidor de lenguaje de F# (
fsautocomplete), así que cualquier editor con buen soporte LSP puede usarse - Emacs (
-
Aspectos decepcionantes
fsharp-modese basa en una base de código antigua y avanza lentamente- A Zed le faltan funciones
- En VS Code algunas funciones (por ejemplo, expandir/contraer selección) no funcionan bien
- También hay usuarios a quienes VS Code les resulta incómodo por temas de keybindings o del modelo modal
-
Formateador y linter de código
- Fantomas: formateador oficial de código para F#, usado por la mayoría de usuarios y equipos
- FSharpLint: alguna vez fue popular, pero hoy está prácticamente descontinuado
- Aun así, gracias al compilador potente, la dependencia de un linter es baja
-
Otras herramientas
Casos de uso (Use Cases)
- Gracias al amplio ecosistema de .NET, F# tiene potencial de uso en varios ámbitos
- En especial, por su función de Type Providers, es muy adecuado para tareas de análisis y manipulación de datos
- También es apropiado para desarrollar servicios backend y aplicaciones full stack, y algunas herramientas incluso permiten desarrollo frontend
-
Principales áreas de uso
- Análisis de datos: usando type providers de F#, es posible manipular datos con base en tipos estáticos
- Servicios backend: se puede usar F# junto con los potentes frameworks web de .NET
- Apps frontend: con Fable y Elmish es posible desarrollar UI integrada con el ecosistema JS
- Desde
Fable 4, también puede transpilar a TypeScript, Rust, Python y otros lenguajes
- Desde
-
Ejemplos con Fable (comandos simples de transpilation)
- JavaScript:
dotnet fable - TypeScript:
dotnet fable --lang typescript - Python:
dotnet fable --lang python
- JavaScript:
Situación de la comunidad
- En general, la comunidad no es grande y podría ser incluso más pequeña que la de OCaml
- Reddit y Discord son los espacios de comunicación más activos
- También existe una comunidad en Slack, pero es difícil acceder por problemas con el sistema automático de invitaciones
- El papel de Microsoft dentro de la comunidad no está claro, y el impulso comunitario parece fuerte
-
Principales recursos que opera la comunidad
- Amplifying F#: impulsa la difusión de F# y la participación de empresas
- F# for Fun and Profit: archivo de tutoriales y ensayos
- F# Lab: toolkit comunitario de F# para ciencia de datos
- F# Weekly: newsletter con recopilación de noticias recientes sobre F#
Popularidad y realidad (The Popularity Contest)
- F# no ocupa posiciones altas en la mayoría de los indicadores de popularidad (TIOBE, StackOverflow, ofertas laborales, etc.)
- Pero esta también es la realidad que enfrentan la mayoría de los lenguajes funcionales, así que no es un problema exclusivo de F#
- Sigue sin ser mainstream, pero tiene una base de usuarios de tamaño similar a la de otros lenguajes funcionales como Clojure, OCaml y Emacs Lisp
-
¿Por qué usar F#?
- Hay muchas razones para elegir un lenguaje de programación más allá de la empleabilidad
- Por diversión (también se dice que la F de F# significa “Fun”)
- Para aprender nuevos paradigmas e ideas
- Para entrenarse a pensar de otra manera y salir de formas de pensamiento familiares
- Hay muchas razones para elegir un lenguaje de programación más allá de la empleabilidad
-
Material relacionado
- Artículo sobre la popularidad de F#
- Análisis de la popularidad de F# con datos de 2024
- También puede consultarse la versión en video de ese artículo
Comparación entre F# y OCaml
El objetivo inicial de F# era llevar las ventajas de OCaml a .NET y las ventajas de .NET a OCaml
– Don Syme, creador de F#
- F# fue desarrollado inspirado en OCaml, y al principio era tan parecido que incluso soportaba extensiones de archivo
.mly.mli - Con el tiempo evolucionó como un lenguaje cada vez más independiente, y ahora ambos avanzan en direcciones propias
-
Ventajas de F#
- Basado en la plataforma .NET
- Permite aprovechar una enorme cantidad de librerías
- Soporte de Microsoft
- Amigable para principiantes
- Sintaxis familiar para quienes vienen de lenguajes orientados a objetos (como C#)
- Los mensajes de error del compilador son relativamente claros
- La experiencia de depuración es más intuitiva
- Fuerte soporte para programación asíncrona
- Ofrece funciones que no existen en OCaml
- Registros anónimos
- Active patterns
- Expresiones computacionales (computational expressions)
- Sequence comprehensions
- Type providers
- Unidades de medida (units of measure)
- Basado en la plataforma .NET
-
Desventajas de F#
- Basado en la plataforma .NET
- Hay muchos compromisos de diseño para interoperar con
.NET(como permitirnull)
- Hay muchos compromisos de diseño para interoperar con
- Propiedad de Microsoft
- Hay diferencias en la afinidad que cada quien tiene hacia Microsoft
- Se asignan relativamente pocos recursos a F#
- A largo plazo, no está claro cuánto seguirá apoyando Microsoft a F#
- Problemas relacionados con el nombre
- A quienes no les gustan las convenciones de nombres
PascalCaseycamelCasepodría resultarles incómodo - El nombre F# puede causar problemas en búsquedas o nombres de archivo (por eso también suele escribirse como FSharp)
- A quienes no les gustan las convenciones de nombres
- Ausencia de funciones avanzadas presentes en OCaml
- Módulos de primera clase, functores (functor)
- Soporte insuficiente para GADT
- No tiene mascota ni tampoco camello
- Basado en la plataforma .NET
-
Puntos en común y comparación mutua
- Ambos lenguajes pueden apuntar al runtime de JavaScript
- F#: Fable
- OCaml: js_of_ocaml, Melange
- Por ahora, Fable da la impresión de estar más maduro, aunque hace falta más experiencia de uso real
- Ambos son lenguajes potentes pero de nicho, y es poco probable que se vuelvan lenguajes masivos en el corto plazo
- F# tiene la practicidad de poder infiltrarse poco a poco en bases de código existentes de C#
- Una desventaja es que los proyectos de F# todavía usan archivos de proyecto basados en XML y hay que especificar manualmente el orden de compilación
- Esto puede sentirse engorroso frente a
Dune, el sistema de build de OCaml
- Esto puede sentirse engorroso frente a
- Para fines educativos o para aprender estructura de lenguajes, OCaml puede ser más adecuado
- Para servicios web prácticos o desarrollo backend, F# puede ser una mejor opción
- En especial, como lenguaje que se integra bien con
.NETy al mismo tiempo mantiene un estilo funcional, F# es una herramienta muy potente
- Ambos lenguajes pueden apuntar al runtime de JavaScript
Impresiones finales
- El autor sintió que F# era un lenguaje mucho más divertido y práctico de lo que esperaba
- Dice que le dio una sensación similar a cuando conoció Clojure por primera vez
- En particular, eso le recordó que Clojure fue el Lisp más práctico gracias a su excelente interoperabilidad con Java
- Si .NET hubiera sido de código abierto y portable desde el principio,
- ClojureCLR podría haberse vuelto más popular de lo que es hoy
- y lamenta que la comunidad y el ecosistema de F# también podrían haber crecido más
- El hecho de que F# no fuera open source hasta 2010 también obstaculizó su adopción temprana
"El mayor error fue que tanto .NET como F# no fueran de código abierto al principio, y por eso se perdieron muchas oportunidades" – Don Syme
- OCaml tampoco es difícil de aprender, pero para quien aprende por primera vez un lenguaje de la familia ML, F# puede ser más fácil
- La barrera de entrada para llegar a producción también es más baja
- En especial, enfatiza que si ya tienes experiencia con .NET, definitivamente vale la pena probar F#
- F# no solo es excelente como lenguaje independiente, sino que también abre la oportunidad de aprovechar el potente ecosistema de .NET
- Con herramientas como Fable, es posible transpilar código F# a JavaScript, Dart, Rust, Python y otros lenguajes
- En la comunidad de F# existe la frase de que “la F de F# significa Fun”
- El autor dice que, tras usarlo directamente, sintió que eso era cierto, y subraya que no solo es divertido, sino también práctico
- Finalmente, también menciona la estabilidad y confiabilidad de F# con la idea de que “si compila, casi siempre funciona bien”
In sane type systems we trust!
1 comentarios
Opiniones en Hacker News
F# fue el mejor lenguaje funcional para reescribir una app de Ruby on Rails
Intentaron usar F#, pero eran nuevos en el ecosistema .NET
Nuestra empresa cambió de C# a F# hace 6 años
La adopción de F# se ha estancado por culpa de un mal sistema de build
Aprendieron F# en 2013 y se divirtieron mucho
F# es uno de esos casos raros en los que todos sus usuarios están muy satisfechos
A medida que C# ha ido incorporando muchas funciones de F#, las ventajas de F# se han ido reduciendo
Existe un SaaS rentable escrito completamente en F#
F# es un lenguaje excelente
F# es hermoso, pero fue difícil llegar a usarlo con fluidez