Dans Haskell, deux fonctions permettent d'effectuer une opération sur une liste d'éléments afin de la réduire à une seule valeur. (Il y en a plus de deux, bien sûr, mais ce sont les deux qui m'intéressent.) Ils sont foldl1
et foldr1
. Si l'opération à effectuer est commutative (comme l'ajout), peu importe lequel vous utilisez. Le résultat sera le même. Cependant, si l'opération est et non commutative (par exemple, soustraction), alors les deux produisent des résultats très différents. Par exemple:Quelle est la manière la plus efficace d'implémenter foldl1 de Haskell dans J?
foldr1 (-) [1..9]
foldl1 (-) [1..9]
La réponse à la première est 5 et à la seconde, -43. L'équivalent de J foldr1
est l'adverbe insert, /
, par exemple,
-/ 1+i.9
qui est l'équivalent de foldr1 (-) [1..9]
. Je veux créer un adverbe dans J qui fonctionne comme l'adverbe d'insertion, mais se plie à gauche au lieu de droit. Le mieux que je pouvais trouver est la suivante:
foldl =: 1 : 'u~/@|.'
Ainsi, on pourrait dire:
- foldl 1+i.9
et obtenir -43 comme la réponse, qui est ce qu'on attend d'un pli gauche.
Y a-t-il une meilleure façon de le faire dans J? Pour une raison quelconque, inverser l'argument y
ne me semble pas efficace. Peut-être y a-t-il un moyen de le faire sans avoir à recourir à cela.
Je ne sais pas s'il y a quelque chose en plus de retourner le tableau, aussi pratique que cela puisse paraître. On pourrait penser (ou espérer) Haskell ne fait pas cela et fonctionne seulement la fonction de la fin ... – MPelletier
Je voulais dire "peu importe comment IMpractical." – MPelletier