1 pontos por GN⁺ 2024-11-11 | 1 comentários | Compartilhar no WhatsApp
  • Por que o F# 9 é importante: o F# 9 introduz uma ampla variedade de melhorias que tornam os programas mais seguros, resilientes e com melhor desempenho

Tipos de referência anuláveis

  • O F# foi projetado para evitar null, mas ao fazer interface com bibliotecas .NET escritas em C#, null pode aparecer
  • Agora o F# permite tratar, de forma type-safe, tipos de referência em que null é um valor válido
  • Exemplo:
    • let notAValue: string | null = null
    • let len (str: string | null) = match str with | null -> -1 | NonNull s -> s.Length

Propriedades .Is* em Discriminated Unions

  • Discriminated Unions agora têm propriedades geradas automaticamente para cada case
  • Isso permite verificar se um valor é de um case específico
  • Por exemplo, é possível escrever person.contact.IsEmail

Padrões ativos parciais podem retornar bool em vez de unit option

  • Antes, padrões ativos parciais retornavam Some () quando havia correspondência, e None caso contrário
  • Agora também podem retornar bool

Preferência por métodos de extensão em vez de propriedades internas quando argumentos são fornecidos

  • O F# agora resolve métodos de extensão definidos com o mesmo nome que uma propriedade interna do tipo
  • Isso segue um padrão visto em algumas bibliotecas .NET

Suporte a Computation Expressions com corpo vazio

  • O F# agora oferece suporte a Computation Expressions vazias
  • Exemplo: let xs = seq { }
  • Isso fará com que o método Zero do builder seja chamado

Diretivas hash aceitam argumentos que não são strings

  • Antes, diretivas hash para o compilador só aceitavam argumentos string entre aspas
  • Agora podem receber argumentos de qualquer tipo
  • Exemplo: #nowarn 0070

Expansão da diretiva #help no fsi

  • A diretiva #help do F# Interactive agora mostra documentação para o objeto ou função informado
  • Pode ser passada sem aspas
  • Exemplo: #help List.map;;

Suporte ao prefixo FS em #nowarn para desativar avisos

  • Antes, ao escrever #nowarn "FS0057", aparecia uma mensagem dizendo que o número do aviso era inválido
  • Agora o número do aviso é aceito mesmo com o prefixo

Aviso ao usar o atributo TailCall em função não recursiva ou valor vinculado com let

  • Agora o F# emite um aviso quando o atributo [<TailCall>] é usado em um lugar incorreto
  • Isso não afeta o código, mas pode confundir quem o lê

Aplicação de alvos de atributos

  • O compilador agora aplica corretamente AttributeTargets a valores let, funções, declarações de union case, construtores implícitos, structs e classes
  • Isso pode evitar bugs, como esquecer de adicionar um argumento unit em testes Xunit

Atualizações da biblioteca padrão

Funções Random para coleções

  • Novas funções foram adicionadas aos módulos List, Array e Seq para amostragem aleatória e embaralhamento
  • Versões que usam uma instância compartilhada de Random, implícita e thread-safe
  • Versões que recebem uma instância de Random como argumento
  • Versões que recebem uma função randomizer personalizada
  • Estão disponíveis as funções Shuffle, Choice, Choices e Sample

Construtor sem parâmetros de CustomOperationAttribute

  • Isso facilita criar operações personalizadas para builders de Computation Expressions
  • Não é necessário especificar explicitamente o nome (na maioria dos casos, ele coincide com o nome do método)

Suporte a expressões de coleção do C# para F# List e Set

  • Ao usar F# List e Set em C#, agora é possível inicializá-los com expressões de coleção
  • Exemplo: FSharpSet<int> mySet = [ 1, 2, 3 ];

Melhorias de produtividade para desenvolvedores

Recuperação do parser

  • Melhorias contínuas foram feitas na recuperação do parser
  • As ferramentas continuam funcionando mesmo quando o código ainda não está sintaticamente correto durante a edição

Diagnósticos

  • O F# 9 traz muitas mensagens de diagnóstico novas ou aprimoradas
  • Como em métodos override ambíguos, uso de membros abstratos e unions com campos duplicados

Visibilidade real

  • A forma como o F# gera assemblies tem o problema de gravar membros private como internal em IL
  • Agora é possível corrigir esse comportamento com a flag de compilador --realsig+

Melhorias de desempenho

Verificação de igualdade otimizada

  • As verificações de igualdade agora são mais rápidas e reduzem a alocação de memória

Compartilhamento de campos em struct Discriminated Unions

  • Quando vários cases de uma struct DU têm campos com o mesmo nome e tipo, eles podem compartilhar a mesma posição de memória
  • Isso reduz o espaço de memória da struct

Otimização de intervalos inteiros

  • O compilador agora gera código otimizado para mais instâncias das expressões start..finish e start..step..finish
  • Antes, a otimização só acontecia quando o tipo era int/int32 e o step era a constante 1 ou -1
  • Agora todos os tipos inteiros e outros valores de step também são otimizados

Otimização de for x in xs -> ... em comprehensions de List/Array

  • for x in xs -> ... foi otimizado em comprehensions de List e Array
  • Especialmente em Array, há ganhos de velocidade de até 10x e redução de alocação para cerca de 1/3 a 1/4

Melhorias nas ferramentas

Live Buffer no Visual Studio

  • Antes era um recurso opt-in, mas agora fica ativado por padrão
  • O compilador em segundo plano da IDE agora opera com o buffer vivo do arquivo
  • Não é mais necessário salvar o arquivo em disco para aplicar alterações

Analisador e correção de código para remover parênteses desnecessários

  • Às vezes parênteses extras são usados para dar clareza, mas em outros casos são apenas ruído
  • Agora o Visual Studio oferece uma correção de código para removê-los

Suporte a visualizadores personalizados para F# no Visual Studio

  • Os visualizadores do depurador do Visual Studio agora funcionam em projetos F#

Exibição de ajuda de assinatura no meio de pipelines

  • Antes, a ajuda de assinatura não era oferecida quando uma função no meio de um pipeline já tinha parâmetros curried complexos aplicados, como lambdas
  • Agora a dica de assinatura para o próximo parâmetro é exibida

1 comentários

 
GN⁺ 2024-11-11
Comentários do Hacker News
  • F# é minha linguagem favorita desde que a conheci na época da faculdade. Ela tem recursos mais avançados que C#, e embora o C# também venha adotando esses recursos, há dificuldades por causa de compatibilidade. F# continua sendo uma linguagem excelente, compatível com o ecossistema .NET, e pode oferecer desempenho equivalente ao de C# com menos boilerplate

  • F# é um dos melhores produtos que a Microsoft lançou desde o Excel, e transformou o .NET em uma plataforma razoável

  • Investi bastante no projeto Phosphor baseado em F#, mas acabamos reescrevendo tudo em Typescript e Rust. Tentei manter segurança de tipos entre várias tecnologias por meio da biblioteca Fable, mas houve problemas de interoperabilidade entre bibliotecas e a gestão de dependências foi difícil. Acho que F# só se encaixa bem quando há uma separação tradicional entre frontend e backend

    • Entre as tecnologias que usamos internamente hoje, as mais interessantes são a biblioteca Effect e o Moonbit. O Moonbit parece uma versão moderna de F# sem dependência de MS/.NET, e tem potencial para ser uma linguagem adequada para um mundo centrado em IA
  • Em uma disciplina de criptografia em que era possível escolher qualquer linguagem baseada em .NET, meus trabalhos feitos em F# eram mais fáceis de ler do que os dos outros. Como quase 100% do trabalho em ciência de dados é feito em Python, não consegui usar mais F#

  • Sinto falta de trabalhar com F#, mas continuo acompanhando as atualizações. As ferramentas eram bem boas apesar do tamanho da comunidade e do desinteresse da Microsoft. O maior problema era a precisão da cobertura de testes do código

  • Usei F# recentemente e, vindo de Python, gostei de poder usar um REPL. Quero fazer um pequeno projeto de backend web no inverno para conhecer melhor a linguagem e o ecossistema. Ouvi coisas boas sobre o Oxpecker para a parte de HTTP

  • Tenho curiosidade sobre a forma como o F# gerencia versionamento. Houve muitas melhorias de qualidade, mas não parece que seja necessária uma mudança de versão principal. Fico me perguntando se isso é para alinhar a numeração com o .NET9

  • Gostaria de saber qual é o estado do F# como alternativa ao C# para criar aplicativos GUI no Windows, e se existem empresas que usam F# para isso

  • Nunca usei F#, mas encontrei um site que parece ter bons recursos: fsharpforfunandprofit.com

  • Tenho curiosidade sobre o estado do F# em Linux/MacOS. Quero saber se ele é algo voltado só para Windows ou se parece uma linguagem com suporte completo