si je spécifie le type (je pense) correct pour une fonction d'ordre élevé, le compilateur OCaml rejette l'utilisation seconde de cette fonction.type de fonctions d'ordre élevé
Le code
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
conduit au message d'erreur suivant
File "test.ml", line 6, characters 14-15: Error: This expression has type float -> string but an expression was expected of type int -> string
La première utilisation de f
semble fixer le type de son premier paramètre à int -> string
. Je pourrais comprendre ça. Mais ce que je ne comprends pas, c'est que l'omission de la restriction de type sur f
résout le problème.
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
et le déplacement f
à portée mondiale résout le problème aussi:
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
Pourquoi est-ce que le premier exemple ne compile pas tandis que les plus plus tard faire?
Je suis perplexe par votre question, mais une remarque que je peux faire est que 'let f (g: 'a-> chaîne) (v:' a): chaîne = gv' ne fait pas ce que vous voulez: le' 'a' n'est pas la même dans les deux annotations de type. Vous feriez mieux d'écrire 'let (f: ('a-> chaîne) ->' a -> chaîne) = fun gv -> gv' (qui produit le même type erreur) si vous voulez contraindre' g' et ' v' avec le même '' a'. –
Je recommanderais de l'afficher sur la liste de diffusion OCaml. –
@Pascal: merci, j'ai édité la question – copton