7 puntos por GN⁺ 2025-04-03 | 1 comentarios | Compartir por WhatsApp
  • 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 .fsx y ejecutarse de inmediato con dotnet 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 mutable y 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 printfn es fácil imprimir distintos tipos, lo que resulta útil para depuración y logging
  • Pionero de la programación asíncrona

    • El patrón async/await se 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
  • 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

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

  • Aspectos decepcionantes

    • fsharp-mode se 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

    • Paket: gestor de dependencias para .NET (similar a npm, pip, bundler)
    • FAKE: DSL para escribir scripts de build en F#, similar a rake de Ruby

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
  • Ejemplos con Fable (comandos simples de transpilation)

    • JavaScript:
      dotnet fable
    • TypeScript:
      dotnet fable --lang typescript
    • Python:
      dotnet fable --lang python

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
  • Material relacionado

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 .ml y .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)
  • Desventajas de F#

    • Basado en la plataforma .NET
      • Hay muchos compromisos de diseño para interoperar con .NET (como permitir null)
    • 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 PascalCase y camelCase podrí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)
    • Ausencia de funciones avanzadas presentes en OCaml
      • Módulos de primera clase, functores (functor)
      • Soporte insuficiente para GADT
    • No tiene mascota ni tampoco camello
  • 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
    • 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 .NET y al mismo tiempo mantiene un estilo funcional, F# es una herramienta muy potente

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

 
GN⁺ 2025-04-03
Opiniones en Hacker News
  • F# fue el mejor lenguaje funcional para reescribir una app de Ruby on Rails

    • Se consideraron Haskell, Ocaml, Scala y F#
    • Aunque no estaban familiarizados con la tecnología de Microsoft, F# terminó siendo la primera opción
    • Haskell era difícil de adoptar por su pureza, y el ecosistema de Ocaml era insuficiente
    • Scala parecía complejo
    • F# fue fácil para empezar, y la comunidad era amable, inteligente y siempre dispuesta a ayudar
    • Tiene un ecosistema excelente con acceso a las bibliotecas de dotnet
    • Hay bibliotecas y frameworks excelentes como FsHttp, que permiten interactuar fácilmente con servidores HTTP
    • WebSharper era el mejor framework web de todo el ecosistema
    • Las herramientas no están en su mejor momento, pero hay mucha pasión por el lenguaje
  • Intentaron usar F#, pero eran nuevos en el ecosistema .NET

    • Les sorprendió que se generaran tantos archivos de proyecto y boilerplate para un "hello world"
    • Apoyan FP, la inmutabilidad y los lenguajes modernos, pero hay pocos trabajos
    • Tienden a preferir lenguajes que se puedan usar fácilmente con IA
    • En India la situación era peor, pero en la UE se puede vivir de forma sostenible con Java/TypeScript
    • Es difícil encontrar trabajos bien pagados con Kotlin + TypeScript
  • Nuestra empresa cambió de C# a F# hace 6 años

    • Es difícil hacer la transición desde un lenguaje de estilo C, pero vale la pena
    • La compilación es lenta y no hay soporte para hot reload
    • Hay pocas oportunidades de usarlo profesionalmente
    • Puede ser difícil contratar desarrolladores
  • La adopción de F# se ha estancado por culpa de un mal sistema de build

    • Rust es un lenguaje excelente, pero no encaja en muchos dominios de problemas
    • Una razón para elegir Rust es su sistema de build
    • Incluso lenguajes con fundaciones sin fines de lucro y apoyo de varias empresas siguen teniendo malos sistemas de build
  • Aprendieron F# en 2013 y se divirtieron mucho

    • La experiencia de usuario no era buena
    • Había problemas con las convenciones de nombres, el estilo de llamada de funciones, la sintaxis básica, las funciones del sistema de tipos y el soporte del IDE
    • Se cambiaron a Scala, que se sentía más consistente que F#
    • F# fue su primer lenguaje funcional y cambió su forma de ver la programación
  • F# es uno de esos casos raros en los que todos sus usuarios están muy satisfechos

    • Como ya conocen el ecosistema .NET, parece que sería fácil de aprender
    • Tienen curiosidad por saber qué flujos de trabajo podrían beneficiarse más
  • A medida que C# ha ido incorporando muchas funciones de F#, las ventajas de F# se han ido reduciendo

    • Escriben código C# principalmente en estilo funcional, pero con la ventaja de poder usar las bibliotecas de la forma para la que fueron diseñadas originalmente
  • Existe un SaaS rentable escrito completamente en F#

    • 3dpack.ing
    • Un ray tracer de Rust escrito en F# se compila a WebAssembly
    • fable-raytracer
  • F# es un lenguaje excelente

    • Incluso si no escribes ni una sola línea, es un gran lenguaje de ejemplo
    • Consultan con frecuencia fsharpforfunandprofit.com
  • F# es hermoso, pero fue difícil llegar a usarlo con fluidez

    • Como solo sabían un poco de C#, les costó entender el enfoque orientado a objetos de F#
    • Tuvieron el mismo problema con Clojure y Scala
    • No quieren aprender primero C# o Java