2017-08-20 3 views
2

Je joue avec l'exemple de code de Programming with Erlang. Je suis frappé de funs. aidez-moi à comprendre ce qui ne va pas avec le code ci-dessous. Tout ce que je voulais atteindre était de pouvoir transmettre la variable (avec du plaisir) comme paramètre à mapper. obtenir le coût total de ce moduleJe n'arrive pas à associer de la fun à une variable dans un module erlang

Je continue d'obtenir une erreur de syntaxe/Costeach pas d'erreur initialisée.

Répondre

5

Vous ne pouvez pas définir une fonction comme celle-ci au niveau supérieur. Vous avez deux options: utilisez la syntaxe que vous utilisez mais déclarez-la dans une fonction nommée, ou déclarez-la comme une fonction nommée et utilisez la syntaxe fun name/arity pour la convertir en une fonction anonyme à passer en lists:map.

Première approche:

sum(H|T) -> H + sum[T]; 
sum([]) -> 0. 
totalcost(L) -> 
    Costeach = fun(X) -> {W,Q} = X, shop:cost(W)*Q end. 
    sum(lists:map(Costeach,L)). 

Deuxième approche:

costeach(X) -> {W,Q} = X, shop:cost(W)*Q. 
sum(H|T) -> H + sum[T]; 
sum([]) -> 0. 
totalcost(L) -> sum(lists:map(fun costeach/1,L)). 

Astuce: vous pouvez faire le déstructurer dans les arguments de la fonction dans les deux cas pour sauver une ligne de code:

Costeach = fun({W,Q}) -> shop:cost(W)*Q end. 

ou

costeach({W, Q}) -> shop:cost(W)*Q. 
+0

Ou les meilleures listes 'totalcost (L) ->: sum ([shop: cost (W) * Q || {W, Q} <- L]). ' –

+2

@ Hynek-Pichi-Vychodil C'est plus concis, mais il y a une différence très importante qui est facile à manquer et qui n'est pas explicite dans [la documentation] (http: // erlang. org/doc/programming_examples/list_comprehensions.html), ce qui signifie que la compréhension filtre les éléments qui ne correspondent pas, alors que la clause function va planter. –

+0

@RyanStewart: Je le sais bien sûr mais il n'est pas spécifié en question si une erreur est le comportement souhaité. –