2010-04-29 4 views
4

J'ai deux fonctions f et g et je suis en train de return f(g(x)) mais je ne connais pas la valeur de x et je ne suis pas vraiment sûr de savoir comment s'y prendre.OCaml: corroyage sans valeurs définies

Un exemple plus concret: si j'ai fonctions f = x + 1 et g = x * 2 et je suis en train de return f(g(x)) je devrais obtenir une fonction égale à (x*2) + 1

Répondre

5

Il semble que vous avez raison, f(g(x)) devrait fonctionner correctement. Je ne sais pas pourquoi vous avez un mot-clé il return (ce n'est pas un mot-clé dans OCaml). Voici une version correcte,

let compose f g x = f (g x) 

La définition de type en est,

val compose : ('b -> 'c) -> ('a -> 'b) -> 'a -> 'c = <fun> 

Chacun d'eux, 'a,' b, 'c sont des types abstraits; nous ne nous soucions pas ce qu'ils sont, ils ont juste besoin d'être cohérent dans la définition (donc, le domaine de g doit être dans la gamme de f).

let x_plus_x_plus_1 = compose (fun x -> x + 1) (fun x -> x * 2) 
+0

Merci beaucoup pour votre aide! Mais j'ai une autre question, comment est-ce que nous sommes autorisés à appeler sans composer spécifier une valeur de x? – nicotine

+0

La fonction renvoie la fonction. HOF! – ygrek

+1

Peut-être ce qui se passe est plus clair lors de l'écriture, il 'laisser Compose f g = fun x -> f (g x)', mais ces programmes sont exactement la même chose (on est du sucre syntaxique pour l'autre, je ne suis pas sûr). L'appel à 'composer f g' ne nécessite pas de valeur pour' 'x' parce que composer f g' ne pas utiliser' x': il crée et renvoie une fonction. –