se si specifica il tipo (credo) corretto per una funzione di ordine elevato, il compilatore OCaml rifiuta l'utilizzo di secondo secondo tale funzione.tipo di funzioni di ordine elevato
Il codice
let foo():string =
let f: ('a -> string) -> 'a -> string = fun g v -> g v
in let h = string_of_int
in let i = string_of_float
in let x = f h 23
in let y = f i 23.0
in x^y
conduce alla seguente messaggio di errore
File "test.ml", line 6, characters 14-15: Error: This expression has type float -> string but an expression was expected of type int -> string
Quindi il primo utilizzo di f
sembra definire il tipo del suo primo parametro da int -> string
. Potrei capirlo. Ma quello che non capisco è che l'omissione della restrizione di tipo su f
risolve il problema.
let foo():string =
let f g v = g v
in let h = string_of_int
in let i = string_of_float
in let x = f h 23
in let y = f i 23.0
in x^y
E spostando f
di portata globale risolve il problema, anche:
let f: ('a -> string) -> 'a -> string = fun g v -> g v
let foo():string =
let h = string_of_int
in let i = string_of_float
in let x = f h 23
in let y = f i 23.0
in x^y
Perché è che il primo esempio non compila, mentre quelle successive fanno?
Sono stumped dalla tua domanda, ma un'osservazione che posso fare è che 'f (g: 'a-> string) (v:' a): string = gv' non fa quello che vuoi: il' 'a' non è lo stesso nelle due annotazioni di tipo. Faresti meglio a scrivere let (f: ('a-> string) ->' a -> string) = fun gv -> gv' (che produce lo stesso errore di tipo) se vuoi vincolare 'g' e' v' con lo stesso ''a'. –
Consiglierei di postare questo nella mailing list di OCaml. –
@Pascal: grazie, ho modificato la domanda – copton