programacion - erlang tutorial
¿Erlang tiene un Rownum oculto en una lista? (2)
Este es un ejemplo de mi código actual:
DataSet = [1,2,3,4,5,6,7,8,9].
Sequence = [3,4,5,6].
ReducedDataSet = lists:foldl( fun(SeqNumber, Output) ->
Row = lists:nth(SeqNumber, DataSet),
[Row|Output]
end,
[],
Sequence
).
ReducedDataSet termina como [6,5,4,3] y si lo cambio a listas: foldr, ReducedDataSet sería [3,4,5,6].
No esperaba esto como cuando se lo absorbe de izquierda a derecha, el 3er valor es 3 y debería pasar a 6, pero cuando se absorbe de derecha a izquierda, el 3er valor sería 7 y se pasa a 4.
¿Esto significa que hay un número de fila oculto en mi lista, y foldl y foldr solo difieren en el orden de clasificación de la lista final?
Creo que esta es una pregunta de fold
más general.
En general, fold realiza lo siguiente: (new_element, acc) -> new_acc
Si la operación new_element ° acc
es conmutativa (por ejemplo, la sum
), foldl y foldr son iguales.
Si la operación es "agregar", hay una diferencia entre agregar el elemento a la izquierda o a la derecha.
[3] ° 4 -> [3, 4]
VS 4 ° [3] -> [4, 3]
Nunca recuerdo cuál es foldl
y foldr
pero creo que left / right se refiere a la posición del acumulador ( [3] ° 4
es foldl
con esta definición)
TL; DR
No, no hay un índice oculto o "número de fila" en una lista de Erlang.
Discusión
Puede ser útil explorar un poco más la naturaleza de las operaciones de lista en el contexto de las listas funcionales de la variedad "las listas son un montón de consensos".
Escribí una explicación de pliegues hace un tiempo que podría serle útil: Explicación de listas: función de plegado
Tenga en cuenta que las listas funcionales solo tienen punteros que van en un solo sentido . Es decir, son listas unidas individualmente . No hay concepto de "rownum" o "índice" como lo sería en una matriz de estilo C. Cada llamada a lists:nth/2
está atravesando la lista hasta el n- ésimo elemento antes de devolver ese elemento.
Podríamos escribir lists:nth/2
así si queremos una versión que falle en una entrada incorrecta (y, al buscarla, resulta que está escrita casi exactamente así ):
nth(1, [Element | _]) ->
Element;
nth(N, [_ | Rest]) when N > 1 ->
lists:nth(N - 1, Rest).
(Como nota al margen, considere no incluir las diversiones que requieren que escriba definiciones de varias líneas como argumentos de funciones ...)