® Tópicos Avançados em Linguagens Computacionais – IF724 Aula Prática – FSharp (F#) Leandro...
Transcript of ® Tópicos Avançados em Linguagens Computacionais – IF724 Aula Prática – FSharp (F#) Leandro...
®
Tópicos Avançados em Linguagens Computacionais – IF724
Aula Prática – FSharp (F#)
Leandro Mitsuo Rodrigo Lumack
[email protected] [email protected]
Professor: André Santos
Roteiro
• Configurando o ambiente• Sintaxe
– Estruturas Básicas– Listas, Tuplas e Arrays– Estruturas de Controle– Expressões Condicionais– Criação de Tipos– Funções– Tipos Algébricos– Casamento de Padrões– Acessando .NET– Classes e Objetos
• Chamando C# de F#• Chamando F# de C#• Exemplos de Aplicações
Configurando o Ambiente para o Desenvolvimento no VS
• Primeiramente, deve-se descompactar o arquivo FSharp-1.1.13.8.zip
• Em seguida, executar o arquivo InstallFSharp.msi
Configurando o Ambiente para o Desenvolvimento no VS
• Com o compilador instalado, agora devemos criar um projeto F# (File -> New -> Project -> Other Projects -> F# Projects)
• Em seguida, devemos criar uma classe de F# (.fs file)• Agora é só escrever o código, compilar (ctrl+shift+B) e
executar (F5)
Desenvolvendo sem o VS
• Pode-se escrever o código em algum editor de texto (Notepad++ ou Context) e salvá-lo com a extensão .fs
• Com o prompt, então, podemos compilar o código executando o arquivo fsc.exe (fsc <nome do arquivo.fs>)
• E em seguida, executá-lo
Hello World
• printf “Hello World”;;
• let x = 3 + (4 * 5);;
let res = (if x = 23 then "correct" else "incorrect");;
printf "%s" res ;;
Sintaxe - Estruturas Básicas
• Constantes– Inteiros: 4096, 0xFF– String: “Hello”, “Tab\tTab”– Ponto Flutuante: 3.1215, 1000.045, 1.0e6,
• Operadores– +, -, *, /, %– &&, ||– =, <>, <, >, <=, >=
Sintaxe – Listas
• Listas– Muito utilizadas– São imutáveis
• Não se pode apagar um elemento de uma lista. Pode-se criar uma nova lista sem este elemento
[] -> Lista vazia
[“Hello”; “World”] -> Lista com 2 elementos
“Hello” :: [“World”] -> Lista criada com adição de elemento na frente
[“Hello”] @ [“World”] -> Concatenação de listas
Sintaxe – Tuplas
• Tuplas– Permite agrupar valores de tipos diferentes em um
único elemento
(3, 4);; -> Um par de inteiros
(“Hello”, 4, “World”);; -> Uma tripla de Strings e um inteiro
let addThree (a,b,c) = a + b + c;;
let addPairs (a,b) (d,e) = (a+d, b+e) ;;
Sintaxe – Arrays
• Arrays
let arr = Array.create 3 ""
do arr.(0) <- "hello"
do arr.(1) <- " "
do arr.(2) <- "world"
let str = string.Join("",arr);;
Sintaxe – Expressões Condicionais
• Expressões Condicionais
• if (4 > 3) then "Hello\n" else "Goodbye\n“;;
• if (4 = 3) then AddThree(1,3,5) else 6 + 7;;
Sintaxe – Estruturas de Controle
• Estruturas de Controle
• let y = 5;; let z = ref y;; while (!z > 3) do z := !z - 1; printf “z = %d\n" !z; done;
• let x = Array.create 3 1;;for i = 0 to Array.length(x) - 1 do
printf "x[%d] = %d\n" i x.(i); done;
Sintaxe – Criação de Tipos
• Criação de Tipos
• type key_value = {
key : string;
value : string;
}
let test = { key="a"; value=“Hello" };;
printf "key = %s\n" test.key;;
Sintaxe – Estruturas Básicas
• É possível criar tipos que recebem valores genéricos (polimorfismo paramétrico)
• type ('a, 'b) key_value_g = {
key : 'a;
value : 'b;
}
let sth_g = { key=10; value="deset"; };;
printf "key = %d\n" sth_g.key;;
Sintaxe – Funções
• Podemos criar 2 tipos de funções:– Iterativas
• Precisam utilizar o símbolo ‘!’ para manipular os valores de constantes
– Recursivas• Necessita do uso da palavra ‘rec’
• Função fatorial iterativa• let fac (n) =
let ret = ref 1 infor i = 1 to n do ret := !ret * i;done;printf "Fatorial(%d) = %d\n" n !ret;;
fac (3);
Sintaxe - Funções
• Função fatorial recursiva• let rec fac1(n) =
if (n = 0) then 1 else n * fac1(n-1);;
let r = fac1(4);;
printf "Resultado = %d\n" r;;
Sintaxe – Funções
• Outro exemplo de função recursiva: Fibonacci• let rec fib n =
if n <= 2 then 1 else fib (n-2) + fib(n-1);;• let f = fib(5);;
printf "Resultado = %d\n" f;;
Sintaxe – Funções
• Função lambda– Podemos armazenar uma função em uma
variável e chamá-la sempre que quisermos• let lambda = (fun x -> x + 1);;
printf "res = %d\n" (lambda 3);;
• let tmp = List.map lambda [1;2;3];;
let aux = List.to_array tmp;;
for j = 0 to Array.length(aux) - 1 do
printf "x[%d] = %d\n" j aux.(j);
done;;
Exercício 1
• Crie uma função Map (ela recebe uma função e uma lista como parâmetros e retorna uma lista cujos elementos sofreram a aplicação da função)
• Crie um caso de teste para validar sua função.
Sintaxe – Tipos Algébricos
• Casamento de Padrões
• type weekday = Monday | Tuesday | Wednesday | Thursday | Fridaylet workRate (d:weekday) = match d with | Monday -> 1 | Tuesday -> 2 | Wednesday -> 3 | Thursday -> 4 | Friday -> 5;;
let day = workRate Monday;;printf "dia = %d\n" day;;
Sintaxe – Tipos Algébricos
• Casamento de Padrões
• type expr =Num of int| Add of expr * expr| Sub of expr * expr
let rec eval e =match e with| Num n -> n| Add (x,y) -> eval x + eval y| Sub (x,y) -> eval x - eval y;;
let exp = Add(Sub(Num 10,Num 5), Num 3)let result = eval exp;;printf "resultado = %d\n" result;;
Sintaxe – Casamento de Padrões
• Casamento de Padrões
• match ("abc","def") with
(x,y) -> printf "x = %s, y = %s" x y;;
let (x,y) = ("abc","def") in
printf "x = %s, y = %s" x y;;
Sintaxe – Acessando .NET
• type room = string;;type number = int;;type date = System.DateTime;;type meeting = | Personal of room * date | Phone of number * date;;
let review = Phone(32,new System.DateTime(2006,05,26));;
let dateOfMeeting (a:meeting) = match a with | Personal(_,d) -> d | Phone(_,d) -> d;;
let data = dateOfMeeting review;;let dia = data.Day;;printf “dia = %d\n" dia;;
Sintaxe – Classes e Objetos
• Classes• type MyObj = class
val first : intval mutable second : intnew(a,b) = { first=a; second=b }member x.First = x.firstmember x.Secondwith get() = x.secondand set(v) = x.second <- vmember x.Write() = printf "f=%i, s=%i\n" x.first x.second
end
let obj = new MyObj(1,2);;
obj.Write();;
Exercício 2
• Crie uma classe Retangulo com atributos Largura e Altura e os métodos Área, Perímetro e Print, que imprime a largura, a altura, a área e o perímetro.
• Crie uma instância dessa classe e chame o método Print.
Chamando F# de C#
• Para que seja possível chamar funções criadas em F# a partir de C#, é necessário criar uma biblioteca de funções F# (.dll)
• Em seguida, simplesmente utilize-a como qualquer outra biblioteca (lembrando que as chamadas de função deverão seguir a sintaxe de C# -> deve-se colocar parênteses)
Chamando F# de C#
• F#• let rec loop n =
if n <= 0 then () else begin print_endline (string_of_int n); loop (n-1) end
type MyData = A | B of int * MyData let rec MyDataPrint d = match d with A -> print_endline "the end!" | B (n,d) -> print_endline (string_of_int n); MyDataPrint d let rec MyDataMap f d = match d with A -> A | B (n,d) -> B (f n,MyDataMap f d)
Chamando F# de C#
• C#• class Tester {
static void Main() { Mydll.loop(10); Mydll.MyData x1 = Mydll.MyData.A(); Mydll.MyData x2 = Mydll.MyData.B(3,x1); Mydll.MyData x3 = Mydll.MyData.B(2,x2); Mydll.MyData x4 = Mydll.MyData.B(1,x3);
Mydll.MyDataPrint(x4); Mydll.MyData x5 = Mydll.MyDataMap(FuncConvert.ToFastFunc(new
System.Converter(square)), x4); Mydll.MyDataPrint(x5); if (Mydll.MyData.IsB(x5)) System.Console.WriteLine("Correct!");
} static object square(object x) { return (int) x * (int) x; } }
Chamando C# de F#
• open System.Windows.Forms;; let form = new Form();; let guiRefresh g = printf "refresh!\n";; form.Paint.Add(fun e -> guiRefresh e.Graphics);; let handler = new PaintEventHandler(fun sender e -> guiRefresh e.Graphics);; form.Paint.AddHandler(handler);; form.Paint.RemoveHandler(handler);;
• open System.Threading;; let t = new Thread(new ThreadStart(fun () -> printf "thread started!\n"));; t.Start();;
Exemplos de Aplicações – Teapot Renderer
Exemplos de Aplicações - Ray Tracer
Exemplos de Aplicações - Sudoku Solver
Exemplos de Aplicações - Visualizador de montador de Genoma
• Segundo o head of computational genomics do DOE Joint Genome Institute, Darren Platt, ele nunca viu um visualizador de montador de genoma tão rápido.– 500 linhas de código
Outras Aplicações
• Jogo para XBOX 360 (F# e XNA)– Dandy Dungeon
• Jogo de xadrez chinês• Compilador para Java• HDFS (Hardware Design and Simulation)
– Biblioteca para projeto de hardware– Implementação para FPGA´s e ASIC´s
Referências
• http://www.ffconsultancy.com/dotnet/fsharp/raytracer/index.html
• http://www.strangelights.com/fsharp/
• http://research.microsoft.com/fsharp/fsharp.aspx
• http://strangelights.com/fsharp/Wiki/default.aspx
• http://cs.hubfs.net/
• http://blogs.msdn.com/dsyme/
• http://cs.hubfs.net/forums
®
Tópicos Avançados em Linguagens Computacionais – IF724
Aula Prática – FSharp (F#)
Leandro Mitsuo Rodrigo Lumack
[email protected] [email protected]
Professor: André Santos