9
votes

À Erlang, est-il un moyen de créer une fonction vide?

J'écris une fonction Erlang qui imprime tous les nombres pairs jusqu'à un paramètre donné.

Jusqu'à présent, j'ai écrit la fonction avec des gardes comme celui-ci: P>

printEven(I,N) when I < N ->
  if
    I rem 2 == 0 -> io:format("~p~n",[I]), printEven(I+1,N);
    I rem 2 == 1 -> printEven(I+1,N)
  end;
printEven(I,N) ->
   io:format("Done").


1 commentaires

Umm, ce code ne peut pas compiler - la première clause devrait se terminer par un demi-cône et non un arrêt complet. L'exécutez-vous dans la coquille? Si vous êtes alors, il imprimera toujours ce qu'il revient et cela revient toujours quelque chose. Si vous ne l'exécutez pas dans la coquille, laissez tomber le format IO: Format ...


6 Réponses :


1
votes

Je crois que le mot clé est " ok "


0 commentaires

4
votes

Retournez un atome.

printempsven (i, n) -> fait.

devrait le faire.


4 commentaires

Je ne veux pas d'imprimer un atome, juste les chiffres dans le texte.


Un atome n'imprime pas. Il va juste arrêter la boucle.


Je devrais clarifier, vous devriez remarquer que la valeur de retour de PrintEven n'est jamais utilisée, vous pouvez donc le renvoyer tout ce qui n'inclut pas un appel récursif.


Sortie toujours effectué pour moi dans la coquille. Le shell affiche les valeurs de retour de toutes les fonctions que vous appelez.



2
votes

Vous pouvez également combiner le test pour même dans la clause Guard. Je préfère également le truc Atom fait - il montre dans votre code que c'est la clause de fonction qui arrêtera la "récursivité".

printEven(I, N) when I<N, I rem 2 == 0 ->
    io:format("~p is even~n", [I]),
    printEven(I+1, N);
printEven(I,N) when I<N ->
    printEven(I+1, N);
printEven(I,N) ->
    done.


2 commentaires

Y a-t-il un moyen de sortir silencieusement? Sans atome?


Non - toutes les fonctions renvoient une valeur. Vous ne testez pas la valeur de la fonction, donc je ne sais pas pourquoi cela compte pour vous?



11
votes

OK, définissez d'abord la fonction:

ok = funky(99),


2 commentaires

En fait, ce code n'est pas assez joli, la deuxième clause doit être écrite comme suit: PrintEven (I, N) -> _ = si je rem 2 == 0 -> io: format ("~ p ~ n", [i]) ; I REM 2 == 1 -> OK% Imprimer Rien Fin fin, PrintEvent (I + 1, N); N'oubliez pas que la clause IF renvoie une valeur - vous ne le feriez probablement pas dans ce cas, mais je suis resté coincé dans le match pour vous rappeler que cela fait :)


Non seulement pouvez-vous rendre les choses plus jolies en évitant de devoir écrire deux fois l'appel de la fonction récursive, vous pouvez rendre les choses plus jolies en évitant de devoir écrire i rem 2 deux fois avec une déclaration de cas. Voir ma réponse.



0
votes
printEven(1, 3) =>  ok
                    ^ 
                    |
              printEven(2, 3) => ok
                                 ^ 
                                 |
                         printEven(3, 3) => ok
                                            ^
                                            |
                                      printEven(4, 3) => ok 

0 commentaires

-1
votes

Cela le ferait:

printEven(I,N) -> ok.


0 commentaires