Linguagem F# – dicas para novatos [fechado]
-
09-06-2019 - |
Pergunta
Parece que aqui no StackOveflow existe um grupo de Fá# entusiastas.
Gostaria de conhecer melhor essa linguagem, então, além do teoria da programação funcional, você pode me indicar os melhores pontos de partida para começar a usar a linguagem F#?Quer dizer, tutoriais, how-tos, mas antes de mais nada exemplos de trabalho para ter a chance de começar a fazer algo e curtir o idioma.
Muito obrigado
Andreia
Solução
Não quero me prostituir horrivelmente, mas escrevi algumas postagens de visão geral em F # no meu blog aqui e aqui.Chris Smith (cara da equipe de F# da MS) tem um artigo chamado 'F# em 20 minutos' - parte 1 e parte 2.
Observe que você deve ter cuidado, pois o CTP mais recente do F # (versão 1.9.6.0) tem algumas alterações sérias em comparação com as versões anteriores, portanto, alguns exemplos/tutoriais disponíveis podem não funcionar sem modificações.
Aqui está um rápido resumo de algumas coisas legais, talvez eu mesmo possa dar algumas dicas aqui que são claramente muito breve e provavelmente não ótimo, mas espero que lhe dê algo para brincar!: -
Primeira observação: a maioria dos exemplos na Internet assume que a 'sintaxe leve' está ativada.Para conseguir isso, use a seguinte linha de código: -
#light
Isso evita que você tenha que inserir certas palavras-chave que estão presentes para compatibilidade com OCaml e também terminar cada linha com ponto e vírgula.Observe que usar esta sintaxe significa que o recuo define o escopo.Isso ficará claro em exemplos posteriores, todos os quais dependem da ativação da sintaxe leve.
Se você estiver usando o modo interativo, deverá encerrar todas as instruções com ponto-e-vírgula duplo, por exemplo: -
> #light;;
> let f x y = x + y;;
val f : int -> int -> int
> f 1 2;;
val it : int = 3
Observe que o modo interativo retorna um resultado 'val' após cada linha.Isto fornece informações importantes sobre as definições que estamos fazendo, por exemplo 'val f :int -> int -> int' indica que uma função que recebe dois ints retorna um int.
Observe que apenas em interativo precisamos terminar as linhas com ponto e vírgula, quando realmente definimos o código F# estamos livres disso :-)
Você define funções usando a palavra-chave 'let'.Esta é provavelmente a palavra-chave mais importante em todo o F# e você a usará muito.Por exemplo:-
let sumStuff x y = x + y
let sumStuffTuple (x, y) = x + y
Podemos chamar essas funções assim: -
sumStuff 1 2
3
sumStuffTuple (1, 2)
3
Observe que existem duas maneiras diferentes de definir funções aqui - você pode separar os parâmetros por espaços em branco ou especificar parâmetros em 'tuplas' (ou seja,valores entre parênteses separados por vírgulas).A diferença é que podemos usar 'aplicação parcial de função' para obter funções que levam menos que os parâmetros necessários usando a primeira abordagem, e não com a segunda.Por exemplo.:-
let sumStuff1 = sumStuff 1
sumStuff 2
3
Observe que estamos obtendo uma função da expressão 'sumStuff 1'.Quando podemos transmitir funções tão facilmente quanto dados que são referidos como a linguagem que possui 'funções de primeira classe', esta é uma parte fundamental de qualquer linguagem funcional como F#.
A correspondência de padrões é muito legal, é basicamente como uma declaração de troca de esteróides (sim, eu peguei essa frase de outro F#-ist :-).Você pode fazer coisas como: -
let someThing x =
match x with
| 0 -> "zero"
| 1 -> "one"
| 2 -> "two"
| x when x < 0 -> "negative = " + x.ToString()
| _ when x%2 = 0 -> "greater than two but even"
| _ -> "greater than two but odd"
Observe que usamos o símbolo '_' quando queremos corresponder algo, mas a expressão que estamos retornando não depende da entrada.
Podemos abreviar a correspondência de padrões usando instruções if, elif e else conforme necessário: -
let negEvenOdd x = if x < 0 then "neg" elif x % 2 = 0 then "even" else "odd"
Listas F# (que são implementadas como listas vinculadas abaixo) podem ser manipuladas assim: –
let l1 = [1;2;3]
l1.[0]
1
let l2 = [1 .. 10]
List.length l2
10
let squares = [for i in 1..10 -> i * i]
squares
[1; 4; 9; 16; 25; 36; 49; 64; 81; 100]
let square x = x * x;;
let squares2 = List.map square [1..10]
squares2
[1; 4; 9; 16; 25; 36; 49; 64; 81; 100]
let evenSquares = List.filter (fun x -> x % 2 = 0) squares
evenSqares
[4; 16; 36; 64; 100]
Observe que a função List.map 'mapeia' a função quadrada para a lista de 1 a 10, ou seja,aplica a função a cada elemento.List.filter 'filtra' uma lista retornando apenas valores na lista que passam pela função de predicado fornecida.Observe também a sintaxe 'fun x -> f' - este é o lambda F#.
Observe que não definimos nenhum tipo - o compilador/interpretador F# 'infere' tipos, ou seja,descobre o que você deseja do uso.Por exemplo:-
let f x = "hi " + x
Aqui, o compilador/interpretador determinará que x é uma string, pois você está executando uma operação que exige que x seja uma string.Ele também determina que o tipo de retorno também será string.
Quando há ambigüidade, o compilador faz suposições, por exemplo: -
let f x y = x + y
Aqui, x e y podem ser vários tipos, mas o padrão do compilador é int.Se você deseja definir tipos, você pode usar a anotação de tipo: –
let f (x:string) y = x + y
Observe também que tivemos que colocar x:string entre parênteses, muitas vezes temos que fazer isso para separar partes de uma definição de função.
Dois operadores realmente úteis e muito usados em F# são os operadores de pipe forward e de composição de função |> e >> respectivamente.
Definimos |> assim: -
let (|>) x f = f x
Observe que você pode definir operadores em F#, isso é muito legal :-).
Isso permite que você escreva coisas de uma forma mais clara, por exemplo: -
[1..10] |> List.map (fun x -> x * x) |> List.filter (fun x -> x % 2 = 0)
Permitirá que você obtenha os primeiros 10 quadrados pares.Isso é mais claro do que: -
List.filter (fun x -> x % 2 = 0) (List.map (fun x -> x * x) [1..10])
Bem, pelo menos acho que sim :-)
A composição da função definida pelo operador >> é definida da seguinte forma: -
let (>>) f g x = g(f(x))
Ou sejavocê encaminha uma operação, apenas o parâmetro da primeira função permanece não especificado.Isso é útil porque você pode fazer o seguinte: –
let mapFilter = List.map (fun x -> x * x) >> List.filter (fun x -> x % 2 = 0)
Aqui mapFilter aceitará uma lista e uma entrada e retornará a lista filtrada como antes.É uma versão abreviada de: -
let mapFilter = l |> List.map (fun x -> x * x) |> List.filter (fun x -> x % 2 = 0)
Se quisermos escrever funções recursivas, temos que definir a função como recursiva colocando 'rec' após let.Exemplos abaixo.
Algumas coisas legais: -
Fatorial
let rec fact x = if x <= 1 then 1 else x * fact (x-1)
enésimo número de Fibonacci
let rec fib n = if n <= 1 then n else fib (n-1) + fib (n-2)
FizzBuzz
let (/%) x y = x % y = 0
let fb = function
| x when x /% 15 -> "FizzBuzz"
| x when x /% 3 -> "Fizz"
| x when x /% 5 -> "Buzz"
| x -> x.ToString()
[1..100] |> List.map (fb >> printfn "%s")
De qualquer forma, isso é um muito breve visão geral, espero que ajude um pouco!!
Outras dicas
Sem dúvida, você deve adquirir o excelente livro "Expert F#" de Don Syme.O livro é muito bem escrito e é adequado tanto para iniciantes quanto para especialistas.Nele, você encontrará material introdutório e muito mais desafiador.Com quase 600 páginas, tem uma boa relação custo-benefício.
Descobri que ele me ensinou muitas técnicas úteis para escrever C# mais funcional, além de fornecer todo o material de referência necessário para começar a escrever aplicativos F# hospedados no Windows.
O livro é publicado pela Apress e tem um site que o acompanha em:http://www.expert-fsharp.com/default.aspx
@kronoz - bem, muito obrigado pela sua longa resposta, é um bom lugar para começar.Seguirei seus conselhos e procurarei o livro que @vecstasy mencionou.
agora, deixe-me codificar :-)
let thanksalot = "thanks a lot"
printfn "%s" (thanksalot);;
Eu estive lendo Programação Funcional do Mundo Real
Com exemplos em F# e C# por:Tomas Petricek
Até agora acho muito bom ensinar conceitos de F#, mostrando as implementações em C# ao lado.Ótimo para programadores OO.
Confira a Centro de desenvolvedores F#.Há também hubFS, um fórum dedicado ao F#.
Se você tiver a versão atual do CTP no Visual Studio, ele permitirá criar um projeto de tutorial em F#, que fornece um Tutorial.fs, contendo exatamente o que seu nome sugere.
Esse tutorial também aponta para uma coleção maior de Exemplos de F# na Microsoft.
Além disso, há um projeto de exemplos de F# em andamento em CodePlex.
Espero que isto ajude,
Michiel