Devido a limitações técnicas, a tipografia desejável do título não pôde ser renderizada corretamente.
F # | ||
Data da primeira versão | 2002 | |
---|---|---|
Paradigma | Funcional , imperativo , orientado a objetos | |
Autor | Don Syme, Microsoft Research | |
Desenvolvedor | F # Software Foundation | |
Última versão | 5,0 (10 de novembro de 2020) | |
Versão de desenvolvimento | Visualização 5.0 (2 de abril de 2019) | |
Digitando | Estático , forte , nominativo , inferido | |
Influenciado por | OCaml , C # , Haskell | |
Implementações | .NET Framework , Mono | |
Licença | Licença Apache | |
Local na rede Internet | fsharp.org | |
Extensão de arquivo | fs, fsi, fsx e fsscript | |
F # é uma linguagem de programação funcional , imperativa e orientada a objetos para a plataforma .NET . F # é desenvolvido pela Microsoft Research e seu kernel é derivado da linguagem OCaml , com a qual é altamente compatível. Essas duas linguagens de programação fazem parte da mesma família das linguagens ML .
Esta linguagem foi projetada especificamente para a plataforma .NET , portanto, fortemente orientada a objetos. Desde novembro de 2010, a Microsoft disponibilizou para todas as bibliotecas principais e seu compilador F #, sob a licença Apache 2.
F # é uma linguagem fortemente tipada que usa inferência de tipo . Este mecanismo delega a digitação de variáveis e funções para o compilador. No entanto, a linguagem permite que o desenvolvedor indique explicitamente o tipo na declaração. Integrado ao ecossistema .NET, o F # suporta os tipos primitivos da plataforma, bem como seus objetos. Além disso, estende o sistema de tipos e permite distinguir entre os chamados tipos imutáveis e aqueles ditos modificáveis. Os objetos são considerados tipos modificáveis (no local) e são usados para configurar o modelo de programação de objetos dentro da linguagem. Os tipos imutáveis são usados principalmente na programação funcional; alterar um tipo imutável cria uma nova instância sem sobrescrever a antiga.
Como a maioria das linguagens derivadas de ML , o padrão F # é o mecanismo de avaliação estrita . No entanto, como Haskell , ele pode implementar avaliação lenta de expressões por meio do uso da palavra-chave lazy. Para programação funcional, ele fornece várias construções e um conjunto de tipos imutáveis: tuplas, registros, tipos de soma e listas.
Uma tupla representa uma coleção de n valores, n ≥ 0. O valor de n corresponde à aridade da tupla. O tipo de unidade representa a tupla vazia cujo único valor possível é (). Este tipo é usado para digitar funções que não recebem um valor como entrada e / ou retornam um. O 3-tupla (ou tripleto) é representado por (A, B, C), onde A, B e C podem ser de qualquer tipo. Uma tupla pode ser usada para armazenar valores apenas quando o número de valores é conhecido no momento da codificação e permanece constante durante a execução.
Um registro é uma versão especializada de tuplas em que os campos são nomeados, como em { Nom:string; Age:int }. As gravações podem ser criados da seguinte forma: { Nom="Toto"; Age=1 }. A palavra with- chave é usada para criar uma cópia do registro: { r with Nom="CD" }cria um novo registro a partir de um registro anterior denominado r e cujo valor no campo Nome é alterado.
O tipo de lista é uma lista encadeada, que pode ser representada quer usando a notação head::tail(composto utilizando o operador ::, o equivalente do operador contras em Lisp / Esquema de idiomas ), ou em uma notação abreviada: [item1; item2; item3]. Uma lista vazia é anotada [].
O último tipo de tipo de dados algébrico , os tipos de soma (que são funcionalmente equivalentes em linguagem C das uniões) podem ser definidos como uma soma de qualquer tipo imutável mencionado acima. Por exemplo,
type A = | ConstructorX of string | ConstructorY of intpode conter valores instanciados por ConstructorXou por ConstructorY. O tipo de valores retornados pelos construtores também pode ser definido.
Aqui está o tradicional hello world :
(* Ceci est un commentaire *) printfn "Hello World!"Este outro exemplo tradicional em linguagens funcionais visa mostrar a concisão que pode ser obtida com este tipo de linguagens:
let rec factorielle n = match n with | 0 -> 1 | _ -> n * factorielle (n - 1)Esta variante, com um acumulador, implementa recursão de terminal , uma otimização comum entre as linguagens funcionais:
let factorielle n = let rec factorielle_recursive n accu = match n with | 0 -> accu | _ -> factorielle_recursive (n - 1) (n * accu) factorielle_recursive n 1