12
votes

L'argument facultatif ne peut pas être effacé?

Je voulais avoir une version de la queue-récursive de list.map , alors j'ai écrit le mien. Ici, il est: XXX

Chaque fois que je compile cette fonction, je reçois: xxx

Tutoriel dit que cela signifie que j'essaie de créer une fonction sans arguments non facultatifs. Mais la fonction ci-dessus prend clairement des arguments non facultatifs.

Je fais probablement juste quelque chose de vraiment stupide, mais quoi?


1 commentaires

Vous devez jeter un coup d'œil aux derniers postes de la liste de diffusion OCAML sur les cartes de la queue récursives. groups.google.com/group/fa.caml/browse_thread/thread/ ...


3 Réponses :


12
votes

Vous avez besoin d'un argument non facultatif après la facultative. Changez simplement l'ordre des arguments de votre fonction: xxx


1 commentaires

Merci beaucoup. Celui-ci va me tromper beaucoup. Je suis habitué à faire des arguments facultatifs dulle comme Python et C ++ exige. :-(



19
votes

Ouais Votre argument non facultatif ne peut pas être dernier, car étant donné que l'OCAML prend en charge des applications partielles, une fonction manquante d'un dernier argument facultatif va simplement ressembler à une fonction partièrement appliquée qui recherche toujours l'argument facultatif. Le seul moyen de dire que vous n'avez pas l'intention de fournir l'argument facultatif est qu'il voit que vous avez fourni une dispute après cela.

Si vous devez le faire en dernier, vous pouvez mettre un mannequin Unité code> Argument après: P>

let rec list_map f l ?(accum=[]) () =
  match l with
      head :: tail -> list_map f tail ~accum:(head :: accum) ()
    | [] -> accum;;


1 commentaires

L'application de la fonction nécessite donc également le factice () argument.



4
votes

Les solutions précédentes compilent, mais ne donneront pas le résultat attendu. La fonction f code> n'est jamais appliquée aux arguments. Un code correct est le suivant: xxx pré>

Le type inféré est: p> xxx pré>

... Contrairement au mauvais: p>

# list_map ( ( ** ) 2.) [1.;2.;3.;4.];;
- : float list = [2.; 4.; 8.; 16.]


0 commentaires