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

Foi útil?

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

O primeiro capítulo do meu livro F# ​​for Scientists está disponível gratuitamente aqui.Temos uma série de programas gratuitos de brinquedos em F# aqui.O primeiro artigo do nosso F#.NET Journal está disponível gratuitamente aqui.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top