Je voulais avoir une version de la queue-récursive de Chaque fois que je compile cette fonction, je reçois: p> 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. P> Je fais probablement juste quelque chose de vraiment stupide, mais quoi? P> P> list.map code>, alors j'ai écrit le mien. Ici, il est:
3 Réponses :
Vous avez besoin d'un argument non facultatif après em> la facultative.
Changez simplement l'ordre des arguments de votre fonction:
Merci beaucoup. Celui-ci va me tromper beaucoup. Je suis habitué à faire des arguments facultatifs dulle comme Python et C ++ exige. :-(
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;;
L'application de la fonction nécessite donc également le factice () code> argument.
Les solutions précédentes compilent, mais ne donneront pas le résultat attendu. La fonction Le type inféré est: p> ... Contrairement au mauvais: p> f code> n'est jamais appliquée aux arguments. Un code correct est le suivant:
# list_map ( ( ** ) 2.) [1.;2.;3.;4.];;
- : float list = [2.; 4.; 8.; 16.]
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/ ...