F Sharp

 Nota: o título deste verbete seria F#. Porém, devido a limitações técnicas sobre o uso de cerquilhas em títulos, utilizou-se F Sharp.
 Nota: Este artigo é sobre a linguagem de programação. Para a nota/acorde musical, veja Fá sustenido.
F#
Paradigma
Surgido em2005 (20–21 anos)
Última versão10.0.0 (11 de novembro de 2025; há 6 meses)
Criado por
Estilo de tipagem
  • estática
  • forte
  • inferida
Influenciada por
LicençaLicença MIT[2]
Extensão do arquivo
  • .fs
  • .fsi
  • .fsx
  • .fsscript
Página oficialfsharp.org

F# é uma linguagem de programação multiparadigma para a plataforma .NET, que engloba programação funcional, imperativa e orientada a objetos. Pertence à família das linguagens ML, e é em grande parte compatível com a linguagem OCaml. Foi inicialmente desenvolvida por Don Syme na Microsoft Research, e então migrou para a Microsoft Developer Division. É distribuida como parte do Visual 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 linguagem OCaml, C++ e ML. É uma linguagem criada de propósito para a plataforma .NET e portanto é orientada a objetos.

Visão Geral

Programação funcional

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 comando let é usado para atribuir valores ao nome. Por exemplo:

let x = 3 + 4

Programação imperativa

F# também suporta programação imperative, com suporte para loops (for e while, mesmo sem break ou continue) e valores mutáveis utilizando a palavra-chave mutable:

// definindo 'x' com valor inicial '1'
let mutable x = 1
// Mudando o valor de 'x' para '3'
x <- 3

Programação orientado a objetos

F#, como as outras linguagens CLI, 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:

  • Notação de ponto (e.g. x.Name)
  • Expressões de objecto (e.g. { new obj() with member x.ToString() = "Olá!" })
  • Construção de objecto (e.g. new Form())
  • Testes de tipo (e.g. x :? string)
  • Coerções de tipo (e.g. x :?> string)
  • Argumentos com nome (e.g. x.Method(someArgument=1))
  • Argumentos opcionais (e.g. x.Method(optionalArgument=1, ?optionalArgument=Some 1)

Suporte para programação orientada em objetos em padrões inclui:

  • Testes de tipo (e.g. :? string as s)
  • Padrões ativos, que podem ser definidos sobre tipos de objetos.[3]

Objetos em F# podem ser declarados como class, 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 objeto
type Person(name : string, age : int) =
    member x.Name = name
    member x.Age = age

Programação assíncrona

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 um async { ... }(ou task { ... } para interopabilidade com as Tasks .NET), por exemplo:

let fetch url =
    async { 
        let request = WebRequest.Create(url)
        let! response = request.GetResponseAsync()
        use responseStream = resposta.GetResponseStream()
        use streamReader = new System.IO.StreamReader(responseStream)
        return streamReader.ReadToEnd()
    }

F# também suporta programação orientada a atores (como em Erlang e Elixir) utilizando o MailboxProcessor:

// Tipo de mensagem enviada para o ator
type Message =
  | Increment
  | Decrement
  | Get of AsyncReplyChannel<int>

// Cria e inicia o ator
let counter =
  MailboxProcessor.Start(fun inbox -> async {
    // Loop que recebe uma mensagem
    let rec loop (count: int) = async {
      let! message = inbox.Receive()
      match message with
      | Increment -> return! loop (count + 1)
      | Decrement -> return! loop (count - 1)
      | Contagem channel ->
        channel.Reply count
        return! loop count
    }
    
    // Inicia o loop para fazer com que o ator execute indefinidamente
    return! loop 0
  })
  
counter.Post Increment
counter.Post Increment
counter.Post Decrement

let count = counter.PostAndReply Get
printfn "A contagem é de %i" count // 1

Programação paralela

A programação paralela é parcialmente suportado através do Async.Parallel, Async.Start e outras operações que executam o bloco assíncrono em paralelo. A programação paralela também é suportada através de Array.Parallel funcional na biblioteca padrão do F#.

Unidades de medida

O sistema de tipos do F# suporta unidades de medida verificando pelos números. A catacterísticas da unidade de medida se integra com o tipo do F# requisitando um mínimo de anotações no código do usuário.

Metaprogramação

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.

JavaScript

F# pode compilar para JavaScript utilizando o compilador Fable (Também pode compilar para outras como Dart, TypeScript, Rust e Python).

Publicação do código fonte

Em 4 de novembro de 2010, no blog de Don Syme, foi anunciada a liberação do código fonte sob a licença Apache 2.0.[4] O compilador e as bibliotecas estão agora disponíveis como um repositório no GitHub[5]

Ferramentas de Desenvolvimento

Pode-se programar em F# em qualquer editor de texto. Há alguns que possuem suporte específico, como o EMACS. O Visual F# da Microsoft 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 é um framework 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 e Windows, 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.

Áreas de Aplicação

Desenvolvimento Web

F# é usado em conjunto com ASP, .NET, KnockoutJS e outros frameworks para programação Web. F# é o núcleo do WebSharper, onde ele é executado como um código .NET no servidor e como JavaScript no cliente.

Programação Analítica

Dentre outras linguagens, F# é utilizado para programação financeira quantitativa, Comércio de energia, BI e jogos do Facebook.

Comunidade de Código Aberto

A comunidade de código aberto do F# inclui “The F# Software Foundation” e “F# Open Source Group at GitHub”.

História

F# foi desenvolvida e implementada por Don Syme, no Microsoft 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”.

Exemplos de código

Programa Olá Mundo
printfn "Olá, Mundo!"
Lista com três inteiros
let list = [ 1; 2; 3 ]
União discriminada
type MyDU  =
   | Item1
   | Item2 of int * int
   | Item3 of value1: string * value: int
Criando uma classe
type Person(name : string, age : int) =
    member x.Name = name
    member x.Age = age
Tipos nulos[6] (F# 9)
let variable: string | null = null

let checkNull (v: 't | null) = // Função para verificar se uma variável é nula.
   match v with
   | null -> true // É nulo.
   | _ -> false // Não é nulo.
   
checkNull variable // true

Fable

open Fable.Core

// Implementa a função alert(texto) do javascript.
[<Global>]
let alert: string -> unit = jsNative

// Diz hello world no navegador.
alert "Hello World from JS"

Unidades de medida

[<Measure>] type h // horas
[<Measure>] type km // quilômetros

let velocidade = 30.0<km/h>

Ver também

Referências

  1. Syme, Granicz & Cisternino (2007):2 "F# also draws from Haskell particularly with regard to two advanced language features called sequence expressions and workflows."
  2. «Licensa do F#» 
  3. «Pattern Matching in F# Part 2 : Active Patterns». Consultado em 24 de novembro de 2012 
  4. Announcing the F# Compiler + Library Source Code Drop (em inglês)
  5. «dotnet/fsharp». Consultado em 8 de junho de 2021 
  6. Whats new in F# 9 Consultado em 26 de dezembro de 2024

Bibliografia

  • (em inglês) Expert F# - Antonio Cisternino, Adam Granicz, Don Syme - 2007 - Apress

Ligações externas

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.