• Non ci sono risultati.

Pattern Matching in Standard ML

N/A
N/A
Protected

Academic year: 2021

Condividi "Pattern Matching in Standard ML"

Copied!
10
0
0

Testo completo

(1)

Pattern Matching in Standard ML

Luca Abeni, Csaba Kiraly

April 11, 2016

(2)

• “Trucco” per funzioni a pi `u argomenti senza usare currying:

• Uso com unico argomento una coppia (o “tupla”)

val sommaquadrati = fn (x, y) => x ∗ x + y ∗ y;

• Ma... Come funziona?

• Coppia “(x, y)”

• Invocando la funzione si crea un doppio binding?

• sommaquadrati (3, 4) crea binding fra x e 3 e fra y e 4

• Standard ML usa un meccanismo di pattern matching

• Informalmente: (x, y) `e un pattern che viene matchato con la coppia (3, 4)

• Perch ´e ci sia match bisogna che x valga 3 ed y valga 4

• Vediamo di capire meglio queste cose...

(3)

Pattern

• Vari tipi di pattern:

• Valore costante

• Variable pattern: <var> o <var>:<type>

• Tupla: (<pattern1>, <pattern2>, ... <patternn>)

• Wildcard pattern:

• Pattern tupla: composti da n pattern pi `u semplici

• Wildcard pattern: matcha qualsiasi cosa

• Esempi:

• 1, false, "Ciao", ...: pattern costanti

• (1, x): pattern tupla (di 2 elementi) composto da un pattern costante (1) ed un variable pattern (x)

(4)

• Operazione di confronto fra un valore ed un pattern (meglio: fra un pattern costante ed un pattern)

• Pattern costanti matchano solo col valore del pattern

• Pattern costante: matcha solo con un pattern costante uguale

• Pattern variabili matchano se il valore `e del tipo giusto; creano legame fra valore e nome

• Pattern tupla matchano solo se tutte le componenti della tupla matchano

• matcha con tutto. Si usa spesso per la clausola “default” (o simile)

• Esempi:

• (true, true) matcha con (true, x) legando il valore true al simbolo x

• (5, 4) matcha con ( , x) legando il valore 4 al simbolo x.

Notare che qualsiasi coppia di numeri matcha questo pattern

(5)

Pattern ed Invocazione di Funzioni

• Quando una funzione viene invocata, pattern matching fra parametro attuale e parametro formale!

val succ = fn n => n + 1;, invocata come succ 2

• Pattern matching fra n e 2

• Match: crea legame fra n e 2 nel corpo di succ

• Se il parametro formale `e un pattern tupla, match solo se anche il parametro attuale `e un pattern tupla (stesso numero di elementi)

val sommaquadrati = fn (x, y) => x ∗ x + y ∗ y;

• sommaquadrati 3;: pattern matching fra (x, y) e 3

• Fallisce!

• sommaquadrati (3, 4);: pattern matching fra (x, y) e (3, 4)

• Ha successo se x matcha con 3 e y matcha con 4

• Crea binding x ← 3 e y ← 4

(6)

• In quali altri casi Standard ML usa pattern matching?

• Generica creazione di binding (val)

> v a l ( a , b ) = ( 1 , t r u e ) ; v a l a = 1 : i n t

v a l b = t r u e : b o o l

• Definizione di funzioni “per casi”

• Utile il costrutto case

• Sorta di “if on steroids”

(7)

Costrutto case

• ”case”:

case x of

p a t t e r n 1 => exp 1 | . . . | p a t t e r n N => exp N ;

• prima valuta l’espressione x

• poi confronta il valore ottenuto con i pattern specificati (pattern 1, pattern 2, ecc.)

• valuta l’espressione alla prima corrispondenza

• una funzione pu `o anche essere definita per casi fn x => case x of

<p a t t e r n 1 > => <e x p r e s s i o n 1 >

| <p a t t e r n 2 > => <e x p r e s s i o n 2 >

. . .

| <p a t t e r n N > => <expression N >;

(8)

• esempio:

v a l g i o r n o = fn n => case n of 1 => ” Lunedi ”

| 2 => ” M a r t e d i ”

| 3 => ” M e r c o l e d i ”

| 4 => ” G i o v e d i ”

| 5 => ” Venerdi ”

| 6 => ” Sabato ”

| 7 => ” Domenica ”

| => ” Giorno non v a l i d o ” ;

• il pattern cattura tutti i casi non precedentemente enumerati (numeri interi minori di 1 o maggiori di 7)

• come nel caso di if .. then .. else .. :

• tutti gli exp devono avere lo stesso tipo

• i pattern devono coprire tutti i possibili valori

(9)

Pattern: fn, Sintassi Semplificata

• sintassi semplificata

v a l g i o r n o = fn n => case n of 1 => ” Lunedi ”

| 2 => ” M a r t e d i ” . . .

| => ” Giorno non v a l i d o ” ;

v a l g i o r n o = fn 1 => ” Lunedi ”

| 2 => ” M a r t e d i ” . . .

| => ” Giorno non v a l i d o ” ;

(10)

• Pattern: non solo costanti e “default” come in C, ma essere anche:

• nomi: crea binding con scope locale fra valore della espressione e nome nel pattern

v a l f = fn a => case a of 0 => 1000.0

| x => 1 . 0 / ( r e a l x ) ;

• tuple: associa nomi ad elementi di un tuple v a l somma = fn ( a , b ) => a + b ; v a l ( x , y ) = ( 4 , 5 ) ;

Riferimenti

Documenti correlati

The obtained complexes, tested in vitro towards a panel of human tumor cell lines showed an interesting antiproliferative effect on both cisplatin-sensitive

In other words, a high average cohesion of European political groups may be the result of every vote where EPGs are highly cohesive, or the result of a large

Ciò che si evince da questo è non solo l’interesse dei visitatori nel capire di più della persona che ha realizzato le opere, al di là delle opere stesse, rispecchiato

Evaluation of the time required respectively for creating the weighted graph (first column) and for performing a single segmentation on an object (second column).. Both the

‘‘Invariants of Distance k-Graphs for Graph Embedding’’ by Czech presents new graph features based on the degrees of dis- tance k-graphs, axillary structures representing

o il soggetto mantiene una lista degli osservatori registrati, per notificare a ciascuno di essi i propri cambiamenti di stato invocando un metodo

• un metodo statico che restituisce un riferimento all’istanza (creando tale istanza la prima volta che viene invocato, e restituendo la stessa per tutte le invocazioni

A questo punto, avendo trovato il primo pattern che corrisponde al selettore, l’intera espressione match viene riscritta come l’espressione corrispondente a tale pattern, nella quale