7
votes

OCAML Suite Passage Style

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.

donc c'est comme xxx

sur cps, je sais que j'ai besoin d'ajouter un argument à la fonction Pass Donc, comme xxx

mais je n'ai aucune idée de comment gérer ce k et comment fonctionner exactement

par exemple pour cette fonction même pour cette fonction même comme xxx


0 commentaires

4 Réponses :


12
votes

La suite k est une fonction qui prend le résultat de Semk 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 . 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.

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.

Une bonne étape suivante serait d'implémenter paire à l'aide de CPS. Je ferai un exemple plus simple. Si j'ai la fonction de style direct xxx

et si j'assume des primitives CPS mulk et addk , je peux écrire xxx

et vous verrez que la mulptiplication est terminée en premier, il "continue" avec k ', qui fait l'ajout et enfin que continue avec k , qui retourne à l'appelant. L'idée de clé est que dans le corps de muladdk j'ai alloué une nouvelle continuation k ' qui représente un point intermédiaire dans la fonction multiplier. Pour rendre votre travail Semk , vous devrez allouer au moins une de ces continuses.

J'espère que cela aide.


0 commentaires

6
votes

Étant donné que vous avez l'invocation de Evenk 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 .

k 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 de même et passez ce résultat à k , retourner kv plutôt que juste v .


0 commentaires

8
votes

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". XXX

Exemple d'utilisation: "Même [2; 4; 6; 8] id ;;".


0 commentaires

1
votes

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)


0 commentaires