Je suis nouveau à OCAML et j'essaye d'écrire une fonction de style de passage de continuation, mais assez confus, quelle valeur je dois passer en argument supplémentaire sur K
Par exemple, je peux écrire une fonction récursive qui retourne vrai si tous les éléments de la liste est même, sinon faux. p>
donc c'est comme p> sur cps, je sais que j'ai besoin d'ajouter un argument à la fonction Pass
Donc, comme p> mais je n'ai aucune idée de comment gérer ce k et comment fonctionner exactement p> par exemple pour cette fonction même pour cette fonction même comme p>
4 Réponses :
La suite Pour ce que cela vaut, si vous essayez simplement de convertir du style direct au style de passage de continuation, et tout ce que vous aimez, c'est la valeur de La réponse, passant la fonction d'identité comme la continuation est à peu près correcte. p> Une bonne étape suivante serait d'implémenter et si j'assume des primitives CPS et vous verrez que la mulptiplication est terminée en premier, il "continue" avec J'espère que cela aide. P> p> k code> est une fonction qui prend le résultat de
Semk code> et effectue "le reste du calcul" et produit la "réponse". Quel type de réponse a et ce que vous entendez par «le reste du calcul» dépend de ce que vous utilisez CPS pour em>. Le CPS n'est généralement pas une fin en soi mais est fait avec un certain but à l'esprit. Par exemple, sous forme de CPS, il est très facile d'implémenter des opérateurs de contrôle ou d'optimiser les appels de la queue. Sans savoir ce que vous essayez d'accomplir, il est difficile de répondre à votre question.
paire code> à l'aide de CPS. Je ferai un exemple plus simple.
Si j'ai la fonction de style direct p>
mulk code> et
addk code>, je peux écrire p>
k ' code>, qui fait l'ajout et enfin que
continue code> avec
k code>, qui retourne à l'appelant. L'idée de clé est que dans le corps de
muladdk code> j'ai alloué une nouvelle continuation
k ' code> qui représente un point intermédiaire dans la fonction multiplier. Pour rendre votre travail
Semk code>, vous devrez allouer au moins une de ces continuses. P>
Étant donné que vous avez l'invocation de Evenk code> correct (avec la fonction d'identité - convertissant efficacement le style de passage de continuation au style normal), je suppose que la difficulté consiste à définir
Semk code>. p>
k code> est la fonction de continuation représentant le reste du calcul et produisant une valeur finale, comme l'a dit Norman. Donc, ce que vous devez faire est de calculer le résultat de
v code> de
même code> et passez ce résultat à
k code>, retourner
kv code> plutôt que juste
v code>. p>
Chaque fois que j'ai joué avec des CPS, la chose transmise à la suite est juste la chose que vous retourneriez normalement à l'appelant. Dans ce cas simple, un joli "lubrifiant d'intuition" est de nommer la suite "retour". Exemple d'utilisation: "Même [2; 4; 6; 8] id ;;". p> p>
Vous voulez donner en entrée le résultat de votre fonction comme s'il n'était pas écrit avec le style de passage de continuation.
Voici votre fonction qui teste si une liste n'a même pas des entiers: P>
(* val evenk : int list -> (bool -> 'a) -> 'a *) let evenk input cont = let result = even_list input in (cont result)