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