OCaml - inferenza tipo
Ciao a tutti, ho un problema a capire un esempo e mi farebbe piacere se qualcuno di voi volesse spiegarmelo:
DAto il codice:
io avrei propposto una soluzione un po' diversa:
Pongo:
quindi sostituendo avrei:
Le due soluzioni sono equivalenti?
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
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)
scusami molto ma... potresti estendere la spiegazione? non ho capito

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.
ho capito, grazie mille!