6
votes

F #: Plus de points de retour dans les fonctions, comment les gérer?

J'ai un problème lors du retour des valeurs dans des fonctions complexes. Les exemples sont toujours meilleurs:

Considérez la fonction suivante: P>

let myf (mypar: int) =
   if mypar = 2 then
      () (* No error *)
   mypar + 1


1 commentaires

3 Réponses :


4
votes

Avez-vous essayé d'utiliser un sinon code> à la place?

let myf (mypar: int) =
   if mypar = 2 then
      4
   else
      mypar + 1


2 commentaires

Qu'est-ce que le paquet correspondant? Vous voulez dire correspondance de modèle?


@NyinitHann: Absolument - c'est ce que je reçois pour poster juste comme je quitte le travail :)



10
votes

f # n'a pas de déclaration de retour. Le seul moyen de faire ce que vous voulez ici, de choisir un bloc ou l'autre, est avec si .. ele : xxx < P> Alternativement, jeter une exception issue de la fonction précoce: xxx


2 commentaires

Oui, cela fonctionne, mais mon problème, de manière générale, c'est que, également à imbriquée, tandis que je ne peux pas retourner ... Devrais-je utiliser des flux de travail ?????


Non, vous devriez plutôt écrire votre boucle comme une fonction récursive.



15
votes

Pour ajouter d'autres détails, le problème avec votre approche est que tout dans F # est une expression em>. Cela rend beaucoup plus facile de raisonner sur vos programmes (car vous n'avez pas besoin de garder une trace de l'énoncé exécutant actuellement em>), mais cela signifie que vous devez toujours écrire une expression complète.

Si vous essayez d'écrire quelque chose comme retour code>, ce serait comme si vous écrivez ce qui suit en C # (cela explique probablement pourquoi F # ne permet pas ce genre de choses): P>

if something then ()
else () // implicitly added by the compiler


0 commentaires