En Haskell hay dos funciones que permiten realizar una operación en una lista de elementos para reducirla a un único valor. (Hay más de dos, por supuesto, pero estos son los dos que me interesan). Son foldl1
y foldr1
. Si la operación que se realizará es commutative (como adición), no importa cuál de estos utilice. El resultado será el mismo. Sin embargo, si la operación es no conmutativa (por ejemplo, resta), los dos producen resultados muy diferentes. Por ejemplo:¿Cuál es la forma más eficiente de implementar Haskell's foldl1 en J?
foldr1 (-) [1..9]
foldl1 (-) [1..9]
La respuesta a la primera es 5 y a la segunda, -43. El J equivalente de foldr1
es el adverbio inserto, /
, por ejemplo,
-/ 1+i.9
que es el equivalente de foldr1 (-) [1..9]
. Quiero crear un adverbio en J que funcione como el adverbio de inserción, pero dobla a la izquierda en lugar de a la derecha. Lo mejor que podía llegar a decir lo siguiente:
foldl =: 1 : 'u~/@|.'
Por lo tanto, se podría decir:
- foldl 1+i.9
y obtener -43 como la respuesta, que es lo que se espera de un pliegue izquierda.
¿Hay alguna forma mejor de hacerlo en J? Por alguna razón, revertir el argumento y
no me parece eficiente. Quizás hay una manera de hacer esto sin tener que recurrir a eso.
No sé si existe tal cosa además de voltear la matriz, sin importar lo práctico que parezca. Uno pensaría (o esperaría) que Haskell no hace eso y solo trabaja la función desde el final ... – MPelletier
Quise decir "no importa cuán IMpractical". – MPelletier