Tipo funzioni Caml
Salve. Qualcuno saprebbe farmi un preciso schema di ragionamento per trovare il tipo di funzioni in Caml. Vorrei capire come ragionare in funzioni difficoltose come la seguente:
let f x y z = 1 + (z(x y) y);;
vi ringrazio!
let f x y z = 1 + (z(x y) y);;
vi ringrazio!
Risposte
vai di inferenza, da scope più interno a più esterno e tornando indietro appena hai un tipo primitivo valutato.
(x y)
x: a type -> b type
y: a type
(z(x y) y)
(x y) resituisce un b type
y lo hai già specializzeto in a type
z: b type -> a type -> c type
+: int -> int -> int
1: int
perciò ciò che restituisce (z(x y) y)
non può esser altro che un int, allora vai in ricorsione inversa e specializzi:
c = int
z: b -> a -> int
perciò
let f x y z = 1 + (z(x y) y);;
(a type -> b type) -> a type -> (b type -> a type -> int) -> int
(x y)
x: a type -> b type
y: a type
(z(x y) y)
(x y) resituisce un b type
y lo hai già specializzeto in a type
z: b type -> a type -> c type
+: int -> int -> int
1: int
perciò ciò che restituisce (z(x y) y)
non può esser altro che un int, allora vai in ricorsione inversa e specializzi:
c = int
z: b -> a -> int
perciò
let f x y z = 1 + (z(x y) y);;
(a type -> b type) -> a type -> (b type -> a type -> int) -> int