Nozioni Preliminari

Paradigma Funzionale

Lezione prima del 17 ott

let val x = 5 in x+1 end; --output: val it = 6 : int
 
(fn x => x+1) 9; --output: val it = 10 : int

ML è statico o dinamico? Testiamo runnando:

let val x = 7 in (let val y = x in (let val x = 9 in y end) end) end;
 
--output: val it = 7 : int

L’output è 7 e in questo caso solo un programma statico sarebbe 7, quindi viene da pendare che ML è statico ma in realtà potrebbe essere eager e dinamico e dare comunque 7

let val x = 7 in (let val y = (fn z => x) in (let val x = 9 in (y 3) end) end) end;
 
--output: val it = 7 : int

L’output è 7 quindi possiamo essere sicuri che ML è statico.

Numeri di Church in ML

Definiamo il numero due usando i numeri di Church

val due = (fn x => fn y => x (x y));

Altri esempi

val zero = fn x => fn y => y;

Ora definiamo eval, una funziona che prende un numero di Church e ritorna l’intero associato ad esso:

val eval = (fn z => (z (fn x => x+1) 0));

Testiamo due:

eval due; --output: val it = 2 : int

oss: se a due che concatena due funzioni di arità uno (di fatto è come avere una funzione di arità due) quindi possiamo passargli due input ad esempio possiamo eseguire:

due (fn x => x) 7; --output: 7

Infatti due avrĂ :

  • x = (fn x => x) (funzione di identitĂ )
  • y = 7

Quindi l’output (x (x y)) ovvero viene applicata due volte la funzione di indennità su 7

Ora implementiamo:

val succ = fn w => (fn x => fn y => x (w x y));

Ho fatto w doppio + 1 volte xy

test:

eval (succ due): --output: val it = 3 : int

Ora implementiamo plus:

val plus = fn u => fn v => (u (fn z => (plus z v)) zero);

Ora implementiamo times (prodotto):

val times = fn u => fn v => (u (fn z => (plus z v)) zero);

Lezione 27 ott