Por que F#?
(batsov.com)- F# é uma linguagem funcional da família ML voltada para .NET e desenvolvida pela Microsoft. Em comparação com o C#, que é majoritariamente orientado a objetos, F# se concentra no paradigma de programação funcional
- Este texto organiza as características da linguagem F#, seu ecossistema, estado da documentação, ferramentas de desenvolvimento, casos de uso, situação da comunidade e F# vs. OCaml
O que é F#?
- F# é uma linguagem de programação de propósito geral para escrever código conciso, robusto e com bom desempenho
- Foi projetada para que você possa focar na resolução do problema em si, sem se preocupar com sintaxe complexa
- É open source, multiplataforma e tem alta compatibilidade com .NET
-
Características
- Sintaxe leve e imutabilidade por padrão
- Inferência e generalização de tipos
- Funções de primeira classe, tipos de dados poderosos e pattern matching
- Suporte a programação assíncrona (Async)
- A linguagem de origem do famoso operador de pipeline (
|>)
-
Exemplo de código simples
open System let names = [ "Peter"; "Julia"; "Xi" ] let getGreeting name = $"Hello, {name}" names |> List.map getGreeting |> List.iter (printfn "%s") - F# começou como uma linguagem criada por Don Syme na Microsoft Research em 2005
- Surgiu a partir de um projeto de pesquisa para portar o OCaml para a plataforma .NET (Caml.NET)
- Depois, foi incorporada como produto oficial a partir de 2010 e, em 2024, o F# 9.0 foi lançado
- Em 2025, já se consolidou como uma linguagem madura ao completar 20 anos
- Principais motivos para experimentar F#
- Verificar como .NET evoluiu como open source e multiplataforma
- Comparar vantagens e desvantagens em relação ao OCaml
- Avaliações positivas sobre ferramentas como Rider e Ionide
- Interesse em simplesmente explorar uma linguagem
F# como linguagem
- F# é uma linguagem funcional da família ML e tem uma sintaxe familiar para quem usa OCaml
- Desenvolvedores com experiência em Haskell ou Lisp também conseguem se adaptar com facilidade
- Sua estrutura sintática é baseada em espaços em branco e, como em Python, a indentação é importante para a gramática
- Foi projetada para que até iniciantes aprendam a sintaxe básica rapidamente
-
Resumo das características da linguagem
- Definição e aplicação de funções podem ser expressas de forma concisa e natural
- Condicionais, loops, tuplas e processamento de listas podem ser usados de forma limpa em estilo funcional
- Records, enumerações algébricas (Discriminated Union) e pattern matching permitem lidar com estruturas de dados complexas de forma concisa
- Com o operador de pipeline (
|>), é possível organizar o fluxo de dados visualmente como uma composição de funções - F# é muito adequado para escrever scripts ad-hoc; basta usar arquivos
.fsxe executá-los diretamente comdotnet fsi - Também oferece ambiente REPL, o que favorece a programação exploratória
-
Sintaxe amigável
- Inclui recursos práticos de sintaxe como comentários de uma linha e multilinha, variáveis
mutablee slices de lista - Graças à alta compatibilidade com C#, é fácil usar APIs do .NET
- Também oferece suporte natural a sobrecarga de operadores para vários tipos
- Com
printfn, é fácil imprimir vários tipos, o que é útil para depuração e logging
- Inclui recursos práticos de sintaxe como comentários de uma linha e multilinha, variáveis
-
Pioneira na programação assíncrona
- O padrão
async/awaitteve origem no F# 2.0, influenciando depois várias linguagens como C# e JavaScript - F# oferece uma estrutura que permite implementar programação assíncrona de forma intuitiva, sem callbacks
- O fluxo do código parece síncrono na leitura, mas na prática roda de forma assíncrona
- O padrão
-
Investimento da Microsoft e evolução da linguagem
- Durante muito tempo, a Microsoft destinou poucos recursos ao F#, mas em 2022 montou uma equipe dedicada em Praga e iniciou um investimento mais sério
- Com os lançamentos do F# 8.0 e 9.0, a linguagem e o tooling estão melhorando rapidamente
- Com o aumento do interesse interno na Microsoft, também há expectativa sobre seu potencial de evolução futura
F# é uma linguagem prática, fácil de aprender, com um sistema de tipos poderoso e paradigma funcional, sendo uma opção muito atraente especialmente para quem quer introduzir uma abordagem funcional em projetos baseados em .NET
Ecossistema (Ecosystem)
- Pelo uso relativamente curto, a conclusão é que não há tantas bibliotecas ou frameworks exclusivos e puros de F#
- A maioria dos usuários depende das APIs padrão do .NET e de bibliotecas de terceiros projetadas principalmente para C#
- Isso é algo comum em linguagens hospedadas (hosted languages) como Scala, Clojure e Groovy
-
Principais bibliotecas para desenvolvimento web
- Giraffe: framework web leve baseado em ASP.NET Core, com foco em estilo funcional
- Suave: framework simples de servidor web em estilo combinator para roteamento e composição de tarefas
- Saturn: framework em estilo MVC construído sobre o Giraffe, inspirado em Ruby on Rails e Phoenix
- Bolero: framework para desenvolvimento de aplicações cliente baseado em WebAssembly e Blazor
- Fable: transpila F# para JavaScript, permitindo integração com o ecossistema JS como React e Node.js
- Elmish: framework de UI baseado no padrão MVU (Model-View-Update), frequentemente usado com Fable
- SAFE Stack: stack funcional de desenvolvimento web end-to-end que combina Saturn, Fable, Elmish, Azure etc.
-
Principais bibliotecas para ciência de dados
- Deedle: biblioteca de análise e manipulação de dados no estilo pandas
- DiffSharp: biblioteca com foco matemático que oferece machine learning e diferenciação automática
- FsLab: toolkit integrado de ciência de dados com visualização, análise estatística e mais
Estado da documentação
- A documentação oficial, no geral, é bem organizada e de alta qualidade
- Parte dela está no Microsoft Docs e parte no F# Software Foundation
- A organização pode parecer um pouco dispersa, mas o guia de estilo da linguagem, os documentos de design e a API da biblioteca padrão são muito úteis
-
Links de documentação recomendados
-
Materiais de aprendizado da comunidade
- F# for Fun and Profit: coleção de tutoriais e ensaios (um pouco antiga, mas ainda válida)
Ferramentas de desenvolvimento (Dev Tooling)
- No passado, o ecossistema de ferramentas de desenvolvimento para F# era otimizado quase só para o Visual Studio, com pouco suporte para outros editores
- Felizmente, o ambiente de ferramentas melhorou bastante nos últimos 10 anos
-
Ponto de virada técnico: FSharp.Compiler.Service (FCS)
- FCS é uma biblioteca única que inclui compilador do F#, suporte de editor e engine de scripting, permitindo usar F# em vários editores e ambientes de tooling
- Isso tornou possível o suporte a F# em VS Code, geradores de documentação e backends alternativos, impulsionando a expansão do ecossistema
- Um exemplo representativo é o Ionide, que oferece suporte rico a F# no VS Code e já ultrapassou 1 milhão de downloads
-
Editores testados
- Emacs (
fsharp-mode): oferece recursos básicos, sem suporte a TreeSitter e com pouca atividade de desenvolvimento - Zed: suporte a F# limitado
- Helix: tem suporte básico
- VS Code (plugin Ionide): um dos ambientes mais completos
- JetBrains Rider: IDE comercial, mas com suporte muito forte a F#
A maior parte dos recursos funciona com base no servidor de linguagem F# (
fsautocomplete), então qualquer editor com bom suporte a LSP pode ser usado - Emacs (
-
Pontos negativos
fsharp-modeé baseado em uma base de código antiga e evolui lentamente- O Zed ainda carece de recursos
- No VS Code, alguns recursos (como expandir/recolher seleção) não funcionam direito
- Há também usuários que acham o VS Code desconfortável por causa de questões de keybindings/modelo modal
-
Formatador e linter de código
- Fantomas: formatador oficial de código F#, usado pela maioria dos usuários e equipes
- FSharpLint: já foi popular, mas hoje está praticamente descontinuado
- Ainda assim, graças ao compilador poderoso, a dependência de linter é baixa
-
Outras ferramentas
Casos de uso (Use Cases)
- Graças ao ecossistema amplo do .NET, F# pode ser usado em várias áreas
- Em especial, o recurso de Type Providers o torna muito adequado para análise e manipulação de dados
- Também é apropriado para desenvolvimento de serviços de backend e aplicações full stack, e algumas ferramentas até viabilizam desenvolvimento frontend
-
Principais áreas de uso
- Análise de dados: é possível manipular dados com tipagem estática usando os Type Providers do F#
- Serviços de backend: F# pode ser usado junto com os poderosos frameworks web do .NET
- Apps frontend: com Fable e Elmish, dá para desenvolver UI integrada ao ecossistema JS
- A partir do
Fable 4, também é possível transpilar para várias linguagens como TypeScript, Rust e Python
- A partir do
-
Exemplo com Fable (comando simples de transpile)
- JavaScript:
dotnet fable - TypeScript:
dotnet fable --lang typescript - Python:
dotnet fable --lang python
- JavaScript:
Situação da comunidade
- No geral, a comunidade não é grande e pode ser até menor que a do OCaml
- Reddit e Discord são os espaços de comunicação mais ativos
- Também existe uma comunidade no Slack, mas o acesso é difícil por problemas no sistema automatizado de convites
- O papel da Microsoft dentro da comunidade não é claro, e a condução parece ser mais comunitária
-
Principais recursos mantidos pela comunidade
- Amplifying F#: divulgação do F# e incentivo à participação de empresas
- F# for Fun and Profit: arquivo de tutoriais e ensaios
- F# Lab: toolkit comunitário de F# para ciência de dados
- F# Weekly: newsletter com resumo das novidades do F#
Popularidade e realidade (The Popularity Contest)
- F# não aparece em posições altas na maioria dos indicadores de popularidade (TIOBE, StackOverflow, vagas de emprego etc.)
- Mas isso também reflete a realidade da maioria das linguagens funcionais, e não é um problema exclusivo do F#
- Ainda que não seja mainstream, tem uma base de usuários em nível parecido com outras linguagens funcionais como Clojure, OCaml e Emacs Lisp
-
Por que usar F#?
- Há vários motivos para escolher uma linguagem de programação além da empregabilidade
- Pela diversão (há quem diga que o F de F# significa “Fun”)
- Para aprender novos paradigmas e ideias
- Para treinar formas diferentes de pensar, saindo dos hábitos mentais já conhecidos
- Há vários motivos para escolher uma linguagem de programação além da empregabilidade
-
Materiais relacionados
- Texto sobre a popularidade do F#
- Análise da popularidade do F# em 2024
- Também vale consultar a versão em vídeo desse texto
Comparação entre F# e OCaml
O objetivo inicial do F# era levar as vantagens do OCaml para o .NET e as vantagens do .NET para o OCaml
– Don Syme, criador do F#
- F# foi desenvolvido com inspiração no OCaml e, no começo, era tão parecido que até suportava extensões de arquivo
.mle.mli - Com o tempo, foi evoluindo para uma linguagem mais independente, e hoje segue seu próprio caminho
-
Vantagens do F#
- Baseado na plataforma .NET
- Dá acesso a uma enorme quantidade de bibliotecas
- Suporte da Microsoft
- Amigável para iniciantes
- Tem sintaxe familiar para quem já usou linguagens orientadas a objetos (como C#)
- As mensagens de erro do compilador são relativamente claras
- A experiência de depuração é mais intuitiva
- Tem suporte forte a programação assíncrona
- Oferece recursos que o OCaml não tem
- Anonymous records
- Active patterns
- Computational expressions
- Sequence comprehensions
- Type providers
- Units of measure
- Baseado na plataforma .NET
-
Desvantagens do F#
- Baseado na plataforma .NET
- Há várias concessões no design da linguagem por causa da interoperabilidade com
.NET(como permitirnull)
- Há várias concessões no design da linguagem por causa da interoperabilidade com
- Pertence à Microsoft
- Há diferenças de preferência em relação à Microsoft
- Relativamente poucos recursos são destinados ao F#
- No longo prazo, ainda é incerto quanto a Microsoft vai apoiar o F#
- Problemas relacionados ao nome
- Para quem não gosta das convenções de nomenclatura
PascalCaseecamelCase, isso pode incomodar - O nome F# pode causar problemas em buscas ou nomes de arquivo (por isso também se usa muito FSharp)
- Para quem não gosta das convenções de nomenclatura
- Falta de recursos avançados que existem no OCaml
- Módulos de primeira classe e functors
- Suporte limitado a GADT
- Não tem mascote, nem camelo
- Baseado na plataforma .NET
-
Pontos em comum e comparação mútua
- Ambas as linguagens podem ter como alvo runtimes JavaScript
- F#: Fable
- OCaml: js_of_ocaml, Melange
- Hoje, Fable parece mais maduro, mas ainda seria preciso mais experiência prática
- Ambas são linguagens poderosas, porém de nicho, e dificilmente vão se tornar linguagens populares de massa no curto prazo
- F# tem a praticidade de poder se infiltrar aos poucos em codebases existentes de C#
- Um ponto negativo é que projetos em F# ainda usam arquivos de projeto baseados em XML e exigem definir manualmente a ordem de compilação
- Em comparação com o sistema de build
Dune, do OCaml, isso pode parecer trabalhoso
- Em comparação com o sistema de build
- Para fins educacionais ou para aprender a estrutura da linguagem, OCaml pode ser mais adequado
- Para construir serviços web práticos ou backends, F# pode ser uma escolha melhor
- Especialmente como linguagem que se integra bem com
.NETsem abandonar o estilo funcional, F# é uma ferramenta muito poderosa
- Ambas as linguagens podem ter como alvo runtimes JavaScript
Impressões finais
- O autor sentiu que F# é uma linguagem muito mais divertida e prática do que esperava
- Diz que a sensação foi parecida com quando conheceu Clojure pela primeira vez
- Em especial, isso fez lembrar como Clojure era o Lisp mais prático graças à excelente interoperabilidade com Java
- Se o .NET fosse open source e portável desde o começo,
- ClojureCLR poderia ter se tornado mais popular do que é hoje
- e há a lamentação de que a comunidade e o ecossistema do F# também poderiam ter crescido mais
- O fato de F# não ter sido open source até 2010 também atrapalhou sua adoção inicial
"O maior erro foi que tanto o .NET quanto o F# não eram open source no início, e por causa disso muitas oportunidades foram perdidas" – Don Syme
- OCaml também não é difícil de aprender, mas para quem vai aprender uma linguagem da família ML pela primeira vez, F# pode ser mais fácil
- A barreira de entrada até chegar em produção também é menor
- O texto enfatiza que, especialmente para desenvolvedores com experiência em .NET, vale muito a pena experimentar F#
- F# não é só uma ótima linguagem por si só, como também oferece a chance de aproveitar o ecossistema poderoso do .NET
- Com ferramentas como Fable, é possível transpilar código F# para JavaScript, Dart, Rust, Python e outras linguagens
- Na comunidade F#, existe a frase de que o F de F# significa Fun
- O autor diz que, ao usar a linguagem na prática, sentiu que isso é verdade e reforça que ela não é só divertida, mas também prática
- Por fim, também menciona a estabilidade e confiabilidade do F#: “se compila, provavelmente vai funcionar”
In sane type systems we trust!
1 comentários
Comentários do Hacker News
F# foi a melhor linguagem funcional para reescrever um app em Ruby on Rails
Tentei usar F#, mas era novo no ecossistema .NET
Nossa empresa migrou de C# para F# há 6 anos
O motivo da adoção estagnada de F# é o sistema de build ruim
Aprendi F# em 2013 e me diverti muito
F# é um caso raro em que todos os usuários parecem muito satisfeitos
À medida que C# ganha muitos dos recursos de F#, as vantagens de F# estão diminuindo
Existe um SaaS lucrativo escrito inteiramente em F#
F# é uma linguagem excelente
F# é bonito, mas foi difícil usá-lo com fluência