- Por qué F# 9 es importante: F# 9 introduce una amplia gama de mejoras que hacen que los programas sean más seguros, resilientes y con mejor rendimiento
Tipos de referencia anulables
- F# fue diseñado para evitar
null, pero al interactuar con bibliotecas .NET escritas en C#, null puede mezclarse
- Ahora F# permite manejar de forma segura a nivel de tipos los tipos de referencia que pueden tener
null como valor válido
- Ejemplo:
let notAValue: string | null = null
let len (str: string | null) = match str with | null -> -1 | NonNull s -> s.Length
Propiedades .Is* de los Discriminated Union
- Los Discriminated Union ahora tienen propiedades generadas automáticamente para cada case
- Esto permite verificar si un valor corresponde a un case específico
- Por ejemplo, se puede escribir
person.contact.IsEmail
Los patrones activos parciales pueden devolver bool en lugar de unit option
- Antes, los patrones activos parciales devolvían
Some () si había coincidencia, o None si no la había
- Ahora también pueden devolver
bool
Preferencia por métodos de extensión sobre propiedades integradas cuando se proporcionan argumentos
- F# ahora resuelve métodos de extensión definidos con el mismo nombre que una propiedad integrada del tipo
- Esto coincide con un patrón que se ve en algunas bibliotecas .NET
Soporte para Computation Expression con cuerpo vacío
- F# ahora admite Computation Expression vacías
- Ejemplo:
let xs = seq { }
- Esto invoca el método
Zero del builder
Las directivas hash aceptan argumentos que no son cadenas
- Antes, las directivas hash para el compilador solo aceptaban argumentos de tipo cadena pasados entre comillas
- Ahora pueden recibir argumentos de cualquier tipo
- Ejemplo:
#nowarn 0070
Ampliación de la directiva #help en fsi
- La directiva
#help de F# Interactive ahora muestra documentación sobre el objeto o la función proporcionados
- Se puede pasar sin comillas
- Ejemplo:
#help List.map;;
Soporte del prefijo FS en #nowarn para desactivar advertencias
- Antes, si se escribía
#nowarn "FS0057", aparecía un mensaje indicando que el número de advertencia era incorrecto
- Ahora el número de advertencia se acepta incluso con el prefijo
Advertencia al usar el atributo TailCall en funciones no recursivas o valores enlazados con let
- Ahora F# emite una advertencia si el atributo
[<TailCall>] se usa en un lugar incorrecto
- No afecta al código, pero puede confundir a quien lo lea
Aplicación de destinos de atributos
- El compilador ahora aplica correctamente
AttributeTargets a valores let, funciones, declaraciones de union case, constructores implícitos, structs y clases
- Esto puede evitar bugs como olvidar agregar argumentos
unit en pruebas de Xunit
Actualizaciones de la biblioteca estándar
Funciones Random para colecciones
- Se agregaron nuevas funciones para muestreo aleatorio y barajado en los módulos
List, Array y Seq
- Versiones que usan una instancia compartida de
Random implícita y segura para subprocesos
- Versiones que reciben una instancia de
Random como argumento
- Versiones que reciben una función
randomizer personalizada
- Hay funciones
Shuffle, Choice, Choices y Sample
Constructor sin parámetros de CustomOperationAttribute
- Facilita la creación de operaciones personalizadas para builders de Computation Expression
- Ya no es necesario especificar el nombre explícitamente (en la mayoría de los casos, el nombre coincide con el del método)
Soporte para expresiones de colección de C# con List y Set de F#
- Al usar
List y Set de F# desde C#, ahora se pueden inicializar con expresiones de colección
- Ejemplo:
FSharpSet<int> mySet = [ 1, 2, 3 ];
Mejoras en la productividad de los desarrolladores
Recuperación del parser
- Se hicieron mejoras continuas en la recuperación del parser
- Las herramientas siguen funcionando incluso si, mientras se edita el código, este no siempre es sintácticamente correcto
Diagnósticos
- F# 9 incluye muchos mensajes de diagnóstico nuevos o mejorados
- Como en métodos
override ambiguos, al usar miembros abstractos o en unions con campos duplicados
Visibilidad real
- La forma en que F# genera ensamblados tiene el problema de que los miembros
private se escriben como internal en IL
- Ahora este comportamiento se puede corregir con la bandera del compilador
--realsig+
Mejoras de rendimiento
Comprobaciones de igualdad optimizadas
- Las comprobaciones de igualdad ahora son más rápidas y reducen la asignación de memoria
Compartición de campos en Discriminated Union de tipo struct
- Cuando varios case de un DU struct tienen campos con el mismo nombre y tipo, pueden compartir la misma ubicación de memoria
- Esto reduce el espacio de memoria del struct
Optimización de rangos enteros
- El compilador ahora genera código optimizado para más casos de las expresiones
start..finish y start..step..finish
- Antes, solo se optimizaban cuando el tipo era
int/int32 y el paso era la constante 1 o -1
- Ahora también se optimizan todos los tipos enteros y otros valores de paso
Optimización de for x in xs -> ... en comprensiones de List/Array
- Se optimizó
for x in xs -> ... en comprensiones de List y Array
- Especialmente en
Array, con mejoras de velocidad de hasta 10x y reducción de asignaciones a entre 1/3 y 1/4
Mejoras en herramientas
Live Buffer en Visual Studio
- Antes era una función opt-in, pero ahora está habilitada de forma predeterminada
- El compilador en segundo plano del IDE ahora funciona con el buffer en vivo del archivo
- Ya no es necesario guardar el archivo en disco para aplicar los cambios
Analizador y corrección de código para eliminar paréntesis innecesarios
- A veces se usan paréntesis adicionales por claridad, pero en otros casos solo agregan ruido
- Ahora Visual Studio ofrece una corrección de código para eliminar esos paréntesis
Soporte para asistentes de visualización personalizados para F# en Visual Studio
- Los visualizadores del depurador de Visual Studio ahora funcionan en proyectos F#
Mostrar ayuda de firma a mitad de un pipeline
- Antes, no se ofrecía ayuda de firma en situaciones donde una función en medio de un pipeline ya tenía aplicados parámetros currificados complejos (como lambdas)
- Ahora se muestra la ayuda de firma para el siguiente parámetro
1 comentarios
Comentarios en Hacker News
F# es mi lenguaje favorito desde que lo conocí en la universidad. Tiene funciones que iban por delante de C#, y aunque C# también ha ido incorporando esas capacidades, ha tenido dificultades por temas de compatibilidad. F# sigue siendo un lenguaje excelente, es compatible con el ecosistema de .NET y puede ofrecer un rendimiento equivalente al de C# con menos boilerplate
F# es uno de los mejores productos que Microsoft ha lanzado desde Excel, y convirtió a .NET en una plataforma razonable
Invertí mucho en el proyecto Phosphor basado en F#, pero terminamos reescribiéndolo por completo en Typescript y Rust. Intentamos mantener la seguridad de tipos entre distintas tecnologías mediante la biblioteca Fable, pero hubo problemas de interoperabilidad entre bibliotecas y la gestión de dependencias fue difícil. Creo que F# solo encaja cuando existe una separación tradicional entre frontend y backend
En una clase de criptografía donde se podía elegir cualquier lenguaje que usara .NET, las tareas que escribí en F# eran más fáciles de leer que las de los demás. Casi el 100% de mi trabajo de ciencia de datos se hace en Python, así que no he podido usar más F#
Extraño trabajar con F#, pero sigo atento a las actualizaciones. Las herramientas eran bastante buenas a pesar del tamaño de la comunidad y del desinterés de Microsoft. El mayor problema era la precisión de la cobertura de pruebas del código
Probé F# recientemente y, viniendo de Python, me gusta que se pueda usar un REPL. Quiero hacer un pequeño proyecto de backend web en invierno para conocer mejor el lenguaje y su ecosistema. He escuchado cosas buenas de Oxpecker para la parte de http
Me da curiosidad cómo maneja F# su versionado. Hay muchas mejoras de calidad, pero no parece que hiciera falta un cambio de versión principal. Me pregunto si es por hacer coincidir la numeración con .NET9
Me pregunto cuál es el estado de F# como alternativa a C# para crear aplicaciones GUI en Windows, y si hay empresas que lo usen para eso
Nunca he usado F#, pero encontré un sitio que parece ser un buen recurso: fsharpforfunandprofit.com
Me pregunto cómo está F# en Linux/MacOS. Quisiera saber si es algo solo para Windows o si se siente como un lenguaje con soporte completo