Sobes.tech
Middle+

O que é programação funcional em F#?

sobes.tech IA

Resposta da IA

F# é uma linguagem multiparadigma, mas a sua base é a programação funcional. Isto significa que os programas em F# são construídos principalmente em torno de funções que são "puros" - não têm efeitos colaterais e sempre retornam o mesmo resultado com os mesmos dados de entrada. Os conceitos principais incluem:

  • Imutabilidade: Por padrão, os dados em F# são imutáveis. As variáveis são ligações (bindings), e seus valores não podem ser alterados após a criação. Isto simplifica o raciocínio sobre o programa e aumenta a segurança em ambientes multithread.
  • Funções como objetos de primeira classe: As funções podem ser atribuídas a variáveis, passadas como argumentos para outras funções e retornadas de funções.
  • Currificação: As funções em F# aceitam apenas um argumento. Funções que aceitam múltiplos argumentos são automaticamente transformadas numa sequência de funções, cada uma aceitando um único argumento.
  • Correspondência de padrões: Uma construção poderosa para decompor dados e realizar ações dependendo da sua estrutura.
  • Inferência de tipos: O compilador F# pode determinar automaticamente os tipos da maioria das expressões, reduzindo a necessidade de especificar tipos explicitamente.
  • Expressões: A maioria das construções em F# são expressões que retornam um valor. Isto permite construir código mais conciso.

F# utiliza ativamente tipos de dados algébricos (ATDs):

  • Registos: Tipos de dados imutáveis com campos nomeados.
  • Uniões discriminadas: Tipos de dados que representam um de vários valores possíveis, cada um com dados associados. São usados para modelar um número finito de estados ou variantes.
// Exemplo de registo imutável
type Person = { Name: string; Age: int }

// Exemplo de união discriminada
type Shape =
    | Circle of radius: float
    | Rectangle of width: float * height: float

// Exemplo de função com correspondência de padrões
let calculateArea shape =
    match shape with
    | Circle r -> System.Math.PI * r * r
    | Rectangle (w, h) -> w * h

A abordagem funcional em F# favorece a criação de programas modulares, fáceis de testar e paralelizáveis.