Lab 8 - Przemysław Juszczuk
Transkrypt
Lab 8 - Przemysław Juszczuk
Języki deklaratywne dr Przemysław Juszczuk Katedra Inżynierii Wiedzy Laborki 8 dr Przemysław Juszczuk Języki deklaratywne Wprowadzenie wzorowany na OCaml i Haskell; wsparcie dla paradygmatu funkcyjnego, imperatywnego, obiektowego; funkcje lambda; funkcje wyższego rzędu; wartościowanie leniwe; silne typowanie (w przeciwieństwie do np. PHP); obliczanie wyrażeń i przypisywanie stałych (paradygmat funkcyjny). dr Przemysław Juszczuk Języki deklaratywne Wersje F ] 1.0 - 2005 - programowanie funkcyjne, obiektowe, imperatywne; F ] 2.0 - 2010 - programowanie asynchroniczne, programowanie agentowe; F ] 3.0 - 2012 - wyrażenia LINQ; F ] 4.0 - 2015; dr Przemysław Juszczuk Języki deklaratywne let x = 3 + 4 <- to nie jest przypisanie, printfn "%A" x bo x będzie już stałe. let dir = @"c:\projects" (To raczej identyfikator) printfn "%A" dir System.Console.ReadKey() |> ignore 0 |> ignore dr Przemysław Juszczuk Języki deklaratywne podkreślenie lub mała litera jako pierwszy znak; reszta to dowolny znak, podkreślenie lub pojedynczy apostrof. let x = 42 let x’ = 43 Zasięg zmiennych Zasięg zmiennych od miejsca wystąpienia do końca pliku/programu, chyba, że zmienna jest lokalna - np. wewnątrz funkcji. #light "off" let x = 3 + 4 in printfn "%A" x; System.Console.ReadKey() |> ignore; 0 |> ignore; dr Przemysław Juszczuk Języki deklaratywne Słowo kluczowe let let x = 3 let wynik = 3 + 4 ale nie: let _cos = "wartosc" let _cos = "nowa wartosc" Chyba, że - mutable let mutable x = 3 x <- 5 dr Przemysław Juszczuk Języki deklaratywne Pisanie na ekran printfn "hello world from F#" let x = 3 + 4 printfn "%A" x Typowanie let anInt = 10 // mamy int let aFloat = 20.0 // mamy float let aString = "I’m a string!" // a tutaj strings dr Przemysław Juszczuk Języki deklaratywne Funkcje let add x y = x + y // uwaga na wcięcia let wynik = add 2 2 printfn "%A" wynik let kodowanie (phrase:string) = phrase.Replace(’a’, ’c’).Replace(’b’, ’d’) let fraza = kodowanie "ala ma kota" printf "%A" fraza dr Przemysław Juszczuk Języki deklaratywne Zmienne(identyfikatory) a funkcje let n = 10 let add a b = a + b let result = add n 4 printfn "result = %i" result dr Przemysław Juszczuk Języki deklaratywne Lambda funkcje funkcje anonimowe; stosowane przeważnie do operacji na listach - zamiast definiować funkcję, której użyjemy raz, to od razu używamy funkcji anonimowej; parametr funkcji może zostać przekazany od razu jako wyrażenie lambda, czyli funkcja anonimowa; tworzenie funkcji wyższego rzędu, gdzie argumentem funkcji jest inna funkcja; funkcje anonimowe nie są konieczne - zamiast nich można użyć zwykłych zdefiniowanych funkcji (tym bardziej, że mamy Pipe Operator - za chwilę). dr Przemysław Juszczuk Języki deklaratywne Listy let pustaLista = [] let el1 = "one " :: [] let el2 = "one " :: "two " :: [] printf "%A" el2 let stoelementow = [0..100] printf "%A" stoelementow Najpopularniejsze funkcje List.filter : (’T -> bool) -> ’T list -> ’T list let evenOnlyList = List.filter (fun x -> x % 2 = 0) // [1; 2; 3; 4; 5; 6] List.map : (’T -> ’U) -> ’T list -> ’U list np: let list = List.map (fun i -> i + 1) [1;2;3] printfn "%A" list dr Przemysław Juszczuk Języki deklaratywne Coś łatwiejszego let wynik = List.head(List.tail(List.rev([0..15]))) dr Przemysław Juszczuk Języki deklaratywne Coś łatwiejszego - forward pipe let wynik = [0..15] |> List.rev |> List.tail |> List.head dr Przemysław Juszczuk Języki deklaratywne Funkcje wyższego rzędu Funkcje wyższego rzędu let wynik = List.sum (List.map( fun x -> x * -1) // (List.map (fun x -> x * x) // (List.filter (fun x -> x % 7 = 0) [0..500]))) let wynik2 = List.sum (List.map (fun x -> x (List.filter (fun printfn "%A" wynik // (List.map( fun x -> x * -1) // * x) // x -> x % 11 = 0) [0..15]))) co mamy na ekranie? Zadanie Przedstaw powyższą funkcję przy użyciu operatora forward pipe dr Przemysław Juszczuk Języki deklaratywne Jeszcze listy List.append - sklejenie dwóch list; List.average - średnia wartość elementów listy; List.choose - zwraca listę z elementami spełniającymi kryteria; List.concat - skleja listy (więcej niż 2) i ustawia elementy w odpowiednim porządku (elementy pierwszej listy, następnie elementy drugiej listy, elementy trzeciej listy i tak dalej); List.contains - zwraca wartość true/false w zależności od tego, czy dany element znajduje się na liście; List.filter - zwraca nową listę zawierającą elementy, które spełniły warunek; List.head - zwraca głowę listy; dr Przemysław Juszczuk Języki deklaratywne Jeszcze listy cd. List.length - zwraca długość listy; List.map - zwraca nową listę, której elementy powstały poprzez modyfikację elementów z listy pierwszej przy użyciu pewnej funkcji f; List.min, List.max - zwraca element minimalny, maksymalny listy; List.nth - zwraca n-ty element listy; List.rev - zwraca listę w odwróconej kolejności; List.sort - zwraca posortowane elementy listy; https://msdn.microsoft.com/en-us/visualfsharpdocs dr Przemysław Juszczuk Języki deklaratywne Zadania znajdź ostatni element listy; znajdź k-ty element od listy; wypisz parzyste elementy listy w odwrotnej kolejności; usuń co trzeci element listy (operator not ¡¿); sprawdź, czy lista jest palindromem; (patrz Seq.toList); usuń duplikaty w liście (patrz Seq.distinct lub Seq.distinctBy) duplikuj cyfry na liście. dr Przemysław Juszczuk Języki deklaratywne