| F# | |
|---|---|
| Paradigma | |
| Surgido em | 2005 (20–21 anos) |
| Últimaversão | 10.0.0(11 de novembro de 2025; há 3 meses) |
| Criado por |
|
| Estilo de tipagem |
|
| Influenciada por | |
| Licença | Licença MIT[2] |
| Extensão do arquivo |
|
| Página oficial | fsharp |
F# é umalinguagem de programaçãomultiparadigma para a plataforma.NET, que englobaprogramação funcional,imperativa eorientada a objetos. Pertence à família daslinguagens ML, e é em grande parte compatível com a linguagemOCaml. Foi inicialmente desenvolvida por Don Syme naMicrosoft Research, e então migrou para a Microsoft Developer Division. É distribuida como parte doVisual Studio 2019 e como parte do.NET.
As propriedades desta linguagem e o seu ambiente constituem uma plataforma ideal para a informática científica porque utiliza a inferência de tipo. A performance de F# iguala-se com a linguagemOCaml,C++ e ML. É uma linguagem criada de propósito para a plataforma .NET e portanto é orientada a objetos.
F# é uma linguagem de programação primeiramente funcional. Os tipos não precisam ser dadas de forma explícita pelo programador, estes são deduzidos no processo de compilação. O comandolet é usado para atribuir valores ao nome. Por exemplo:
letx=3+4
F# também suporta programação imperative, com suporte para loops (for e while, mesmo sembreak oucontinue) e valores mutáveis utilizando a palavra-chavemutable:
// definindo 'x' com valor inicial '1'letmutablex=1// Mudando o valor de 'x' para '3'x<-3
F#, como as outras linguagensCLI, pode-se usar tipos CLI e objetos através da programação orientada a objetos. F# suporta programação voltada à objetos que inclui expressões:
x.Name){ new obj() with member x.ToString() = "Olá!" })new Form())x :? string)x :?> string)x.Method(someArgument=1))x.Method(optionalArgument=1, ?optionalArgument=Some 1)Suporte para programação orientada em objetos em padrões inclui:
:? string as s)Objetos em F# podem ser declarados comoclass,struct,interface ou delegado tipo definidos, correspondentes às formas encontradas no C#. Por exemplo, uma classe com um construtor com "name" e "age" e declarando duas propriedades:
// Uma declação de um simples objetotypePerson(name:string,age:int)=memberx.Name=namememberx.Age=age
F# suporta programação assíncrona através de fluxos de trabalho assíncronos. Um fluxo de trabalho assíncrona é definida como uma sequência de comandos dentro de umasync { ... }(outask { ... } para interopabilidade com as Tasks .NET), por exemplo:
letfetchurl=async{letrequest=WebRequest.Create(url)let!response=request.GetResponseAsync()useresponseStream=resposta.GetResponseStream()usestreamReader=newSystem.IO.StreamReader(responseStream)returnstreamReader.ReadToEnd()}
F# também suporta programação orientada a atores (como em Erlang e Elixir) utilizando oMailboxProcessor:
// Tipo de mensagem enviada para o atortypeMessage=|Increment|Decrement|GetofAsyncReplyChannel<int>// Cria e inicia o atorletcounter=MailboxProcessor.Start(funinbox->async{// Loop que recebe uma mensagemletrecloop(count:int)=async{let!message=inbox.Receive()matchmessagewith|Increment->return!loop(count+1)|Decrement->return!loop(count-1)|Contagemchannel->channel.Replycountreturn!loopcount}// Inicia o loop para fazer com que o ator execute indefinidamentereturn!loop0})counter.PostIncrementcounter.PostIncrementcounter.PostDecrementletcount=counter.PostAndReplyGetprintfn"A contagem é de %i"count// 1
A programação paralela é parcialmente suportado através doAsync.Parallel,Async.Start e outras operações que executam o bloco assíncrono em paralelo.A programação paralela também é suportada através deArray.Parallel funcional na biblioteca padrão do F#.
O sistema de tipos do F# suporta unidades de medida verificando pelos números. A catacterísticas daunidade de medida se integra com o tipo do F# requisitando um mínimo de anotações no código do usuário.
F# permite algumas formas de customização de sintaxe para suportar códigos de domínio específico sem a linguagem F#, particularmente através de expressões computacionais.
F# pode compilar paraJavaScript utilizando o compiladorFable (Também pode compilar para outras como Dart, TypeScript, Rust e Python).
Em 4 de novembro de 2010, no blog de Don Syme, foi anunciada a liberação do código fonte sob alicença Apache 2.0.[4] O compilador e as bibliotecas estão agora disponíveis como um repositório noGitHub[5]
Pode-se programar em F# em qualquer editor de texto. Há alguns que possuem suporte específico, como o EMACS.O Visual F# daMicrosoft inclui integração total com o Visual Studio. Com o serviço instalado, o Visual Studio pode ser usado para criar em depurar projetos em F#.WebSharper é umframework que permite desenvolver e manter front-ends complexos em JavaScript e HTML5, em F#.MonoDevelop é um ambiente de desenvolvimento integrado que suporta F# em Linux, Mac eWindows, incluindo suporte para o console interativo, como no Visual Studio.Sharp Develop suporta F# desde a versão 3.0.LINQPad suporta F# desde a versão 2.x.
F# é usado em conjunto comASP,.NET,KnockoutJS e outros frameworks para programação Web.F# é o núcleo doWebSharper, onde ele é executado como um código .NET no servidor e comoJavaScript no cliente.
Dentre outras linguagens, F# é utilizado para programação financeira quantitativa, Comércio de energia, BI e jogos doFacebook.
A comunidade de código aberto do F# inclui “The F# Software Foundation” e “F# Open Source Group at GitHub”.
F# foi desenvolvida e implementada por Don Syme, noMicrosoft Research, em Cambridge. Andrew Kennedy contribuiu no desenvolvimento de unidades de medidas. A linguagem F# e as ferramentas Visual F# para Windows são desenvolvidas pela Microsoft. “The F# Software Foundation” desenvolve o compilador de código aberto e ferramentas baseadas em lançamentos de código aberto do “Microsoft Visual F# Team”.
printfn"Olá, Mundo!"
letlist=[1;2;3]
typeMyDU=|Item1|Item2ofint*int|Item3ofvalue1:string*value:int
typePerson(name:string,age:int)=memberx.Name=namememberx.Age=age
letvariable:string|null=nullletcheckNull(v:'t|null)=// Função para verificar se uma variável é nula.matchvwith|null->true// É nulo.|_->false// Não é nulo.checkNullvariable// true
Fable
openFable.Core// Implementa a função alert(texto) do javascript.[<Global>]letalert:string->unit=jsNative// Diz hello world no navegador.alert"Hello World from JS"
Unidades de medida
[<Measure>]typeh// horas[<Measure>]typekm// quilômetrosletvelocidade=30.0<km/h>