OCaml - inferenza tipo

BoG3
Ciao a tutti, ho un problema a capire un esempo e mi farebbe piacere se qualcuno di voi volesse spiegarmelo:

DAto il codice:
let comp (f,g) = function x -> f(g x);;
val comp : (’a -> ’b) * (’c -> ’a) -> ’c -> ’b


io avrei propposto una soluzione un po' diversa:

Pongo:
x: 'a,
g: 'a -> 'b
f: 'b -> 'c


quindi sostituendo avrei:

(('a -> 'b) * ('b -> 'c)) -> ('a -> 'b) -> 'c


Le due soluzioni sono equivalenti?

Risposte
apatriarca
Non sono equivalenti e la soluzione corretta è quella in alto. La funzione infatti restituisce un'altra funzione che prende un valore di tipo 'c (o 'a a seconda di come chiami x) e restituisce f(g x) che ha tipo 'b (o 'c). Un altro modo di scrivere quel tipo sarebbe stato:
(’a -> ’b) * (’c -> ’a) -> (’c -> ’b)

BoG3
scusami molto ma... potresti estendere la spiegazione? non ho capito :(

apatriarca
Sappiamo che f e g sono due funzioni con tipi rispettivamente 'a -> 'b e 'c -> 'a. Vogliamo infatti passare il valore di ritorno di g alla funzione f. A questo punto sappiamo anche che x deve avere tipo 'c perché deve essere passata alla funzione g e che la funzione comp, data la coppia di funzione f e g restituisce una funzione che prende x e restituisce f(g x). Una funzione di questo tipo avrà quindi tipo 'c -> 'b. Quindi comp avrà tipo (’a -> ’b) * (’c -> ’a) -> (’c -> ’b) come scritto correttamente nella tua prima riga.

BoG3
ho capito, grazie mille!

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.