• Non ci sono risultati.

Luca Abeni

N/A
N/A
Protected

Academic year: 2021

Condividi "Luca Abeni"

Copied!
9
0
0

Testo completo

(1)

Liste in SML

Luca Abeni

May 5, 2017

(2)

Liste Standard ML

• α list: liste costituite da una sequenza finita di elementi di tipo α

• Nota: valutazione per valore (non per nome o lazy) → no liste infinite

• Tutto come gi `a visto usando il tipo ricorsivo

datatype ’a lista = vuota | cons of (’ a ∗ ’ a lista )

• Parte del linguaggio ⇒ sintassi semplificata

• vuota ≡ []

• cons ≡ operatore infisso ::

• Rappresentazione semplificata: 1::2::3::[] ≡ [1,2,3]

• Il nome “ufficiale” del tipo `e ’a list

(3)

Liste Standard ML: Esempi

LPM2 Luca Abeni

• cons(1, cons(2, cons(3, vuota)))

• tipo int lista

• Equivalente a 1::2::3::[] (tipo int list)...

• ...Che si scrive anche [1,2,3]

• cons(”Ciao, ” , cons(”come ”, cons(”stai?”, vuota)))

• tipo string lista

• Equivalente a ”Ciao, ” :: ”come ”::” stai ?” ::[] (tipo string list)...

• ...Che si scrive anche [ ”Ciao, ” , ”come ”, ” stai ?”]

• Possibili anche cose pi `u complesse:

• [(1, ”Ciao”), (2, ”come”)]

• [[1, 2], [3, 4, 5]]

(4)

Operatori su Liste

• Ricordate? 2 costruttori 2 funzioni di accesso

• Costruttori: cons e vuota

• Accesso: car e cdr

• Tutto uguale, ma cambiano nomi e sintassi!

• Costruttori: :: (infisso) e [] (anche chiamato nil)

• Accesso: hd e tl

• Funzioni non pure: eccezioni!

• l era ottenibile come cons((car l), (cdr l))

• Diventa hd l :: tl l

(5)

Funzioni sulle Liste

LPM2 Luca Abeni

• In teoria basterebbero i due costruttori, hd e tl...

• ...Ma Standard ML fornisce anche altre funzioni di utilit `a

• Tutte implementabili con costruttori ed operatori di base

• Concatenazione: @. [1, 2] @ [3, 4, 5] = [1, 2, 3, 4, 5]

• Ricordare funzione appendi

v a l rec appendi = fn vuota => ( fn b => b )

| cons ( e , l ) => ( fn b => cons ( e , appendi l b ) ) ;

• Lunghezza: length. length [1,2,3] = 3

• Inverti lista: rev

• Conversione fra stringhe e liste di caratteri: explode e implode

(6)

Definizione di Funzioni su Liste

• Tipo di dato ricorsivo ⇒ funzioni spesso ricorsive

• Base induttiva (fine della ricorsione): lista vuota [] (o nil)

• Passo induttivo: data lista non vuota e::l1, richiama la funzione su l1

• Spesso definite con pattern matching: pattern [] e e::l1 v a l rec f = fn [ ] => . . .

| e : : l 1 => . . .

• La prima clausola non invoca ricorsivamente f

• La seconda clausola pu `o invocare ricorsivamente f

• In caso di pi `u parametri, generalmente ricorsione sul primo!

• Vedi funzione inserisci

(7)

Esempio: Appartenenza ad una Lista

LPM2 Luca Abeni

• Funzione che controlla se un elemento e appartiene ad una lista l

• e non appartiene alla lista vuota

• Se l non `e vuota ed e = hd l, allora e appartiene ad l

• Altrimenti, controlla se e appartiene alla coda di l

v a l rec a p p a r t i e n e = fn e =>

( fn [ ] => f a l s e

| ( h : : l ) => i f e = h then t r u e

else

a p p a r t i e n e e l ) ;

• Notare il tipo: ’’ a −> ’’a list −> bool

• ’’a??? Type variable che accetta solo tipi “speciali”: tipi su cui `e definita uguaglianza!

(8)

Esempio: Lista di Numeri fra n e m

• Ricorsione non solo sulla dimensione della lista...

• Esempio: generare una lista contenente i numeri fra n e m v a l rec numeri =

fn n =>

fn m =>

i f n > m then [ ]

else

n : : ( numeri ( n + 1 ) m) ;

(9)

Esempio pi `u Complesso: Massimo di una Lista

LPM2 Luca Abeni

• Lista vuota: massimo 0

• Lista contenente solo n: massimo n

• Lista contenente due elementi n, m seguiti da un’altra lista

• Se n > m, massimo fra n e la lista rimanente

• Se n ≤ m, massimo fra m e la lista rimanente

v a l rec massimo = fn [ ] => 0

| [ n ] => n

| n : :m: : l => i f n > m then massimo ( n : : l )

else

massimo (m : : l ) ;

Riferimenti

Documenti correlati

“classica” attraverso i processi di predazione, dopo essere stato utilizzato dai procarioti (picoplancton) per la loro crescita e metabolismo. Il nanoplancton

• Esame verbalizzato dopo aver sostenuto entrambi i moduli. • Voto: media dei

• Effetto collaterale: azione che influenza i risultati della computazione, ma senza restituire valori.. • Siamo abituati ad

Se si ricorda che i valori di un tipo possono essere generati da costruttori che ricevono in ingresso uno o pi` u argomenti, diventa chiaro come applicare la ricorsione ai tipi di

Esistono comunque molti diversi fixed point combinator che permettono di calcolare il punto fisso di una funzione senza utilizzare ricorsione esplicita ne’ nella definizione

Per finire, `e interessante notare come un tipo di dato definito tramite “datatype” possa essere definito anche basandosi sul tipo stesso: fino ad ora, abbiamo visto che un

Si dimostri che non esiste alcuna funzione ricorsiva (totale) il cui codominio coincide con

Se non diversamente detto, tutte le funzioni sono dai naturali nei naturali5. Dimostrare che l’insieme delle funzioni ricorsive