Haskell: Higher Order Programming

Slides:



Advertisements
Presentazioni simili
1 Automazione dellalgoritmo ricorsivo di permutazione eseguita da Mariano Melchiorri.
Advertisements

Linguaggi di programmazione
Capitolo 13 Verifica e debug Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © The McGraw-Hill.
Paradigma Funzionale Paradigma Imperativo: Programma = transizione di stato Paradigma Funzionale: Programma = valutazione di un’espressione La maggior.
Paradigma Funzionale Paradigma Imperativo: Programma = transizione di stato Paradigma Funzionale: Programma = valutazione di unespressione La maggior parte.
Liste di Interi Esercitazione. Liste Concatenate Tipo di dato utile per memorizzare sequenze di elementi di dimensioni variabile Definizione tipicamente.
MultiSet, Liste Ordinate
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti.
Tail recursion: esempio
Basi di Dati II Sara Romano
APPUNTI SUL LINGUAGGIO C
Procedure e funzioni nei linguaggi di alto livello Lab Programmazione - turno /2006.
Esempi di riuso del codice nei linguaggi di alto livello Lab Programmazione - turno /2006.
Algoritmi su Tipi Semplici
Esercizi FUNZIONI Passaggio di parametri per valore, variabili e tipi locali e globali, prototipo.
AN FI Un denominatoe comune Comandi u notazioni che esprimono azioni che, una volta eseguite, comportano una modifica permanente dello stato interno.
1 Programmazione = decomposizione basata su astrazioni (con riferimento a Java)
CODIFICA Da flow-chart a C++.
void binario(int n); …………………
Programmazione di Calcolatori
Tail recursion: esempio
Esercizi La distanza di hamming tra due interi x e y si definisce come il numero di posizioni nella rappresentazione binaria di x e y aventi bit differenti.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 2 La ricorsione Corso di Informatica 2 a.a. 2003/04 Lezione 2.
Polimorfismo Significato Significato Varie famiglie Varie famiglie Polimorfismo in java Polimorfismo in java Polimorfismo di Sottotipo: Apparato in Java.
1 Un esempio con iteratore: le liste ordinate di interi.
Esercizio Si legga una sequenza di numeri interi da tastiera (terminatore: 0), quindi: Creare lista L1 con inserimento in testa; cons Creare lista L2 con.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE La Ricorsione Marco D. Santambrogio – Ver. aggiornata al 21 Maggio 2014.
Esercizi 1)Si scriva in Caml un’espressione che introduce una variabile x con valore 3, quindi introduce una variabile y con valore x+2, quindi una variabile.
AlgoLab - Pile e Code Pile e code Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro.
Informatica B Allievi Elettrici - AA Fondamenti della programmazione in linguaggio C (II) Istruzioni e strutture di controllo.
Allievi Elettrici - AA Le funzioni ricorsive in C
Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.
1 Tipi di Dato §descrittori, tipi, controllo e inferenza dei tipi §specifica (semantica) e implementazione di tipi di dato l implementazioni “sequenziali”
Algoritmi e Strutture Dati Strutture Dati Elementari.
Liste di Interi Esercitazione. Una variante Liste concatenate di Integers Non modificabile Costruttori per creare la lista vuota o un nodo Metodi d’istanza.
Liste di Interi Esercitazione. IntList Lista di interi Problema tipico: memorizzare una sequenza di valori [6,0,9,3….9] Vediamo un tipo di dato utile.
Liste Concatenate 11 Aprile E’ una delle strutture dati fondamentali in tutti i linguaggi di programmazione di alto livello Una Lista Concatenata.
1 Un esempio: le liste ordinate di interi. 2 Liste ordinate  OrderedIntList 4 lista ordinata di interi –modificabile.
Case Study - Un (linguaggio) costrutto tipato: Accedere indirizzi fuori dai bounds di un array Char A[n1..n2]; Int i; … i = e … … A[i] … Sono due interi.
Elementi di semantica denotazionale ed operazionale
1 Programmazione Funzionale: ML 1 implementazione del -calcolo tipato l definizione di nuovi tipi ricorsivi l i valori dei nuovi tipi sono termini, che.
1 Informatica Generale Marzia Buscemi Ricevimento: Giovedì ore , Dipartimento di Informatica, stanza 306-PS o per posta.
Liste Concatenate 28 Marzo Avviso Martedi’ 4 Aprile: Verifica di LIP Per iscriversi (obbligatorio) inviare un e- mail entro venerdi’ 31 Marzo a.
7/14/20151 Haskell: ADT n ADT: pricipi, proprietà n ADT in Haskell: il meccanismo n ADT in Haskell: Hiding e Qualified n Esempi: Store e i problemi di.
LIP: 4 Maggio 2007 Interfacce. Cos’e’ una Interfaccia una interfaccia e’ un particolare tipo di classe contiene solo la specifica non ha implementazione.
7/16/20151 Haskell: Tipi basici e Definizioni n Tipi Atomici (scalari) n Valori e Identificatori n Overloading n Definizioni e Layout n Definizioni ricorsive:
1 Tipi di dato modificabili §a livello semantico, riconduciamo la modificabilità alla nozione di variabile l lo stato “modificabile” corrispondente sarà.
Algoritmo per il calcolo del maggiore tra tre numeri qualsiasi Francesco PUCILLO matr
Prof.ssa Rossella Petreschi Lezione del 29/10/2012 del Corso di Algoritmi e Strutture Dati Riferimenti: Capitolo 19 del testo Cormen, Leiserson, Rivest,
Fondamenti di Informatica - D. Talia - UNICAL 1 Fondamenti di Informatica FONDAMENTI DI INFORMATICA Domenico Talia
SUMMERMATHCAMP TARVISIO, AGOSTO 2017
Introduzione al linguaggio C
Algoritmi e Strutture dati a.a.2010/2011 Prof.ssa Rossella Petreschi
Dott. Fabio Massimo Zanzotto a.a
IL CONCETTO DI ALGORITMO
10. Programmazione Ricorsiva Ing. Simona Colucci
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
Strutture di controllo
Haskell: Programmazione con Tuple, Liste
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
L’algoritmo MergeSort
Haskell: controllo dei tipi
Le stringhe in C++ Laboratorio 26 Aprile Dott. Serena Villata
comprensione e modifica di codice
Programmazione funzionale
APPUNTI SUL LINGUAGGIO C
Haskell: Higher Order & Combinator Programming
Ricerca 01/08/2019 package.
HeapSort Stesso approccio incrementale del selectionSort Tipo di dato
Ese 3 (del 3 Aprile 2003).
Transcript della presentazione:

Haskell: Higher Order Programming Linguaggi Funzionali /aa. 03 - M.Bellia Haskell: Higher Order Programming Higher Order Programming: headR, tailR, rote90 Funzioni come valori di parametri Esempi di programmi: rote90 Funzioni: map, fold, filter Verifica: reverse.reverse = id Esercizi 12/7/2018

Higher Order Programming: headR, tailR, rote90 Linguaggi Funzionali /aa. 03 - M.Bellia Higher Order Programming: headR, tailR, rote90 rote90b p | (length (head p)) == 0 = [] | otherwise = (reverse(headR p)):(rote90b(tailR p)) where headR [] = [] headR (x:xs) = (head x):(headR xs) tailR [] = [] tailR (x:xs) = (tail x):(tailR xs) Stessa struttura di controllo (f x) : (g xs) per differenti f e g 12/7/2018

Funzioni come valori di parametri (f x) : (g xs) astratto e astrazione funzionale: \ f -> \g -> (f x):(g xs) headR [] = [] headR (x:xs) = (head x):(headR xs) tailR [] = [] tailR (x:xs) = (tail x):(tailR xs) fR [] _ = [] fR (x:xs) f= (f x):(fR xs f) 12/7/2018

Esempi di programmi rote90b p | (length (head p)) == 0 = [] | otherwise = (reverse(headR p)):(rote90b(tailR p)) where headR [] = [] headR (x:xs) = (head x):(headR xs) tailR [] = [] tailR (x:xs) = (tail x):(tailR xs) rote90b p | (length (head p)) == 0 = [] | otherwise = (reverse(fR p head)):(rote90b(fR p tail)) where fR [] _ = [] fR (x:xs) f = (f x):(fR xs f) 12/7/2018

Funzioni: map, fold, filter Linguaggi Funzionali /aa. 03 - M.Bellia Funzioni: map, fold, filter Sono funzionali Applicano funzioni a liste: map:: (a -> b) -> [a] -> [b] map f [x1,…,xn] = [(f x1),…,(f xn)] foldr:: (a -> b -> b) -> b -> [a] -> b foldr f k [x1,…,xn] = f x1 (f x2 (…(f xn k)…)) foldl:: (b -> a -> b) -> b -> [a] -> b foldl f k [x1,…,xn] = f(f(…(f k x1)…)xn-1)xn filter:: (a -> bool) -> [a] -> [a] filter p [x1,…,xn] = [xk1,…,xkh] 1≤i≤n, ((p xi)  1≤j≤k, xi=xkj 1 ≤ k1<…< kh ≤ n 12/7/2018

map, fold, filter: implementazione map:: (a -> b) -> [a] -> [b] map f [] = [] map f (x:xs) = (f x):(map f xs) foldr:: (a -> b -> b) -> b -> [a] -> b foldr f n [] = n foldr f n (x:xs) = f x (foldr f n xs) foldl:: (b -> a -> b) -> b -> [a] -> b foldl f n [] = n foldl f n (x:xs) = foldl f (f n x) xs filter:: (a -> bool) -> [a] -> [a] filter p [] = [] filter p (x:xs) | (p x) = x:(filter p xs) | otherwise = filter p xs 12/7/2018

map, fold, filter: semplici calcoli Associatività -- calcolare: foldr (+) 0 [2,3,4,5] foldl (+) 0 [2,3,4,5] foldr (-) 0 [2,3,4,5] = 2 - (3 - (4 - (5 - 0))) foldl (-) 0 [2,3,4,5] = ((((0 -2) - 3) - 4) - 5) calcolare: map ((:[]).(2*)) [3,7,2] foldr (max) 0 [-2,9,7,-3,12] 12/7/2018

map, fold, filter: applicazioni Ex 9.1 (craft2) doubleAll -- 3 definizioni: (1) ric. primitiva, (2) list-comprehension, (3) map (1) doubleAll xs = if (null xs) then [] else (2*(head xs)):doubleAll(tail xs) (2) doubleAll xs = [2 * x | x <- xs] (3) doubleAll = map (2 `*`) sum --- sommatoria usando funzionali sum xs = foldr (+) 0 xs sum xs = foldl (+) 0 xs isGreaterN:: Int -> [Int] -> bool --- tutti maggiori di n ? (usando funzionali) isGreaterN n xs = foldr (&&) True (map ( > n) xs) 12/7/2018

map, fold, filter: Applicazioni 2 lowerN:: Int -> [Int] -> [Int] --- tutti i termini minori di n (usando funzionali) lowerN n xs = filter (< n) xs allBooks:: [(autore,titolo,editore,anno)] -> [(autore,titolo,editore,anno)] --- tutti i book scritti da a successivi all’anno k allBooks books a xs = filter (\x->(((a==).fst) x) && (((k<).snd.snd.snd) x)) xs filter!!:: (a -> bool) -> [a] -> [Int] --- indici degli elementi che soddisfano filter!! p xs = 12/7/2018

Higher Order e Nuovi Costrutti Cosa succede in un linguaggio nel quale: I costrutti con i quali si esprimo i programmi sono entità (funzione): if_then_else:: bool -> a -> a -> a I valori calcolati dai programmi sono quelle stesse entità (funzione): Il linguaggio può essere esteso mantenendo proprietà formali cond:: [(bool,a)] -> a cond xs = a --- elemento prima coppia (b,a) il cui predicato b vale true iter:: … iter n f x = f (f … (f x)…) --- n volte f dropUntil:: … dropUntil p xs --- rimuove fino al primo che soddisfa p 12/7/2018

Proof: A | C --- reverse.reverese = id reverse (x:xs) = reverse xs ++ [x] [] ++ ys = ys (x:xs) ++ ys = x:(xs ++ ys) (1) (2) (3) (4) da A: segue Cxs: (reverse.reverse) xs = xs Proof: (Induzione sulla size delle liste) base: |xs|=0 => xs=[]=ys => reverse(reverse[]) = reverse [] = [] --- (1)(1) generale: induc-hyp:  k: xs: |xs|<k => Cxs Sia xs: |xs|=k>0 => xs = x:zs per |zs|<k => => (reverse.reverse) xs = reverse(reverse xs) = reverse(reverse (x:zs)) = reverse(reverse zs ++ [x]) --- (2) = reverse [x] ++ (reverse(reverse zs)) --- lemma rev/++ = (reverse [x]) ++ zs --- induc-hyp. = [x] ++ zs --- lemma rev/[a] = x:[] ++ zs --- def: [a]a:[] = x:zs --- (4)(3) 12/7/2018

Esercizi Modulo Picture: rote90left Fib - stream di fibonacci (lineare + list_comprehension) Dimostrare che: rote90left :: Picture -> Picture rote90left p = let (u,v)=size p in if v==0 then [] else reverse((headR p):rote90left (tail p)) fib = let f = (0,1):[(v,u+v) | (u,v) <- f] in map fst f da A:{foldr f k [] = k ; foldr f k (x:xs) = f x (foldr f n xs)} segue C: foldr f k [x1,…,xn] = f x1 (f x2 (…(f xn k)…)) 12/7/2018

Esercizi Dimostrare che: Sia testo una rappresentazione di un testo come sequenza di linee: testo:: [[char]] occ - trova se una parola occorre in una linea occ parola = or.(map(==parola)) words - tutte le sottosequenze di una parola words n parola | n > (length parola) = [] | otherwise = (take n parola):(words (n-1) (drop 1 parola)) map (\n->take n parola) [0..(length parola)-1] Dimostrare che: da A:{foldl f k [] = k ; foldl f n (x:xs) = foldl f (f k x) xs} segue C: foldl f k [x1,…,xn] == f(f(…(f k x1)…)xn-1)xn 12/7/2018