1 puntos por GN⁺ 2024-11-11 | 1 comentarios | Compartir por WhatsApp
  • 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

 
GN⁺ 2024-11-11
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

    • Lo más interesante que usamos actualmente a nivel interno es la biblioteca Effect y Moonbit. Moonbit parece una versión moderna de F# sin dependencia de MS/.NET, y da la impresión de ser un lenguaje adecuado para un mundo centrado en IA
  • 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