- 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
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
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