7 pontos por GN⁺ 2025-04-03 | 1 comentários | Compartilhar no WhatsApp
  • 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 .fsx e executá-los diretamente com dotnet 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 mutable e 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
  • Pioneira na programação assíncrona

    • O padrão async/await teve 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
  • 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

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

  • 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

    • Paket: gerenciador de dependências para .NET (semelhante a npm, pip e bundler)
    • FAKE: DSL para escrever scripts de build em F#, semelhante ao rake do Ruby

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
  • Exemplo com Fable (comando simples de transpile)

    • JavaScript:
      dotnet fable
    • TypeScript:
      dotnet fable --lang typescript
    • Python:
      dotnet fable --lang python

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

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
  • Materiais relacionados

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 .ml e .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
  • Desvantagens do F#

    • Baseado na plataforma .NET
      • Há várias concessões no design da linguagem por causa da interoperabilidade com .NET (como permitir null)
    • 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 PascalCase e camelCase, isso pode incomodar
      • O nome F# pode causar problemas em buscas ou nomes de arquivo (por isso também se usa muito FSharp)
    • 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
  • 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
    • 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 .NET sem abandonar o estilo funcional, F# é uma ferramenta muito poderosa

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

 
GN⁺ 2025-04-03
Comentários do Hacker News
  • F# foi a melhor linguagem funcional para reescrever um app em Ruby on Rails

    • Foram considerados Haskell, Ocaml, Scala e F#
    • Mesmo sem familiaridade com tecnologias da Microsoft, F# acabou sendo a primeira escolha
    • Haskell era difícil de adotar por causa da pureza, e o ecossistema de Ocaml era insuficiente
    • Scala parecia complexa
    • F# era fácil de começar a usar, e a comunidade era amigável, inteligente e sempre pronta para ajudar
    • Há um ótimo ecossistema com acesso às bibliotecas do dotnet
    • Existem ótimas bibliotecas e frameworks, como o FsHttp, para interagir facilmente com servidores HTTP
    • WebSharper era o melhor framework web de todo o ecossistema
    • As ferramentas não estão no melhor estado, mas há muita paixão pela linguagem
  • Tentei usar F#, mas era novo no ecossistema .NET

    • Fiquei surpreso com a quantidade de arquivos de projeto e boilerplate gerados para um "hello world"
    • Apoio FP, imutabilidade e linguagens modernas, mas há poucas vagas
    • Há uma tendência de preferir linguagens fáceis de usar com IA
    • Na Índia a situação era pior, mas na UE dá para ter uma vida sustentável com Java/TypeScript
    • É difícil encontrar empregos bem pagos com Kotlin + TypeScript
  • Nossa empresa migrou de C# para F# há 6 anos

    • É difícil sair de uma linguagem no estilo C, mas vale a pena
    • A compilação é lenta e não há suporte a hot reload
    • Há poucas oportunidades de usar isso profissionalmente
    • Contratar desenvolvedores pode ser difícil
  • O motivo da adoção estagnada de F# é o sistema de build ruim

    • Rust é uma ótima linguagem, mas não se encaixa em muitos domínios de problema
    • O motivo para escolher Rust é o sistema de build
    • Linguagens com fundações sem fins lucrativos e apoio de várias empresas ainda têm sistemas de build ruins
  • Aprendi F# em 2013 e me diverti muito

    • A experiência do usuário não era boa
    • Havia problemas com convenções de nomenclatura, estilo de chamada de função, sintaxe básica, recursos do sistema de tipos e suporte de IDE
    • Migrei para Scala, que pareceu mais consistente do que F#
    • F# foi minha primeira linguagem funcional e mudou minha visão sobre programação
  • F# é um caso raro em que todos os usuários parecem muito satisfeitos

    • Como já conheço o ecossistema .NET, parece que seria fácil de aprender
    • Fico curioso sobre quais fluxos de trabalho poderiam se beneficiar mais
  • À medida que C# ganha muitos dos recursos de F#, as vantagens de F# estão diminuindo

    • Eu escrevo código C# principalmente em estilo funcional, mas com a vantagem de poder usar bibliotecas da forma como foram pensadas originalmente
  • Existe um SaaS lucrativo escrito inteiramente em F#

    • 3dpack.ing
    • Um ray tracer em Rust escrito em F# e compilado para WebAssembly
    • fable-raytracer
  • F# é uma linguagem excelente

    • Mesmo sem escrever uma única linha, é uma ótima linguagem de referência
    • Consulto frequentemente fsharpforfunandprofit.com
  • F# é bonito, mas foi difícil usá-lo com fluência

    • Como eu sabia só um pouco de C#, foi difícil entender a forma orientada a objetos de F#
    • Tive o mesmo problema com Clojure e Scala
    • Não quero aprender C# ou Java primeiro