Il y a quelques choses qui aident à faire des problèmes comme celui-ci beaucoup plus claire lorsque vous essayez de comprendre une fonction étrangère Lexical scoping fonctionne.
- ajouter dans les types des paramètres et renvoient des valeurs sans modifier le programme, le compilateur vous dira si vous vous trompez ...
- fonctions anonymes avec remplacent celles nommées. Renommez les liaisons de variable qui ont le même nom mais qui se réfèrent à une portée lexicale différente.
- Supprime les liaisons de variables qui ne sont utilisées qu'une seule fois.
liant une valeur à un nom ne est pas réellement exécutée tout calcul, donc est simplement au profit du lecteur, si elle ne fait pas ce travail il ne sert qu'à embrouiller, puis par tous les moyens l'enlever .
fun f (y1 : int -> 'a) = y1 1 : 'a;
fun g (y2 : int) = 7 - y2 : int;
val ans : int = f g;
si g est donné en tant que paramètre à f, f appelle g donnant le paramètre x ayant la valeur 1 prise y2 = 1, g soustrait 7 - 1 reviennent 6. la valeur de retour de g est un int, donc f 'un type auquel g lui est appliqué est un int.
pour le 2ème nettoyer un peu, je tire les années anonymes de fn sortir dans leurs propres et valeurs nommées et appel f (foo, bar) pour le rendre plus lisible ...
fun f p =
let val x = 3
val y = 4
val (z, w) = p
in (z (w y)) + x end
fun foo z = z + 1;
fun bar x = x * 2;
val ans = f(foo, bar);
Enfin , on peut se débarrasser des let valeurs qui ne sont utilisés qu'une fois et remise en place (z, w) = p avec juste (z, w) en tant que paramètre à la fonction qui devrait être beaucoup plus facile à suivre
fun f (z, w) = (z (w 4)) + 3
fun foo z = z + 1;
fun bar x = x * 2;
val ans = f(foo, bar);
val ans = ((4 * 2) + 1) + 3
Avez-vous posé la même question deux fois? –