Ya que mencionas la diferencia entre un "multidimensional" Array
y un Array
de Array
s, que ilustrará el punto muy bien, junto con una comparación con las listas.
Un pliegue (en el sentido de clase Foldable
) es una operación inherentemente lineal, al igual que las listas son una estructura intrínsecamente lineal; un doblez derecho caracteriza completamente una lista al hacer coincidir sus constructores uno a uno con los argumentos al foldr
.Si bien puede definir funciones como foldl
también, hay una opción clara de un doblez canónico estándar.
Array
no tiene una estructura transparente tal que se pueda combinar uno a uno en un pliegue. Es un tipo abstracto, con acceso a elementos individuales proporcionados por valores de índice, que puede ser de cualquier tipo que tenga una instancia Ix
. Entonces, no solo no existe una opción obvia para implementar un pliegue, tampoco existe una estructura lineal intrínseca. Ocurre que Ix
le permite enumerar un rango de índices, pero esto es más un detalle de implementación que cualquier otra cosa.
¿Qué hay de Array
s multidimensional? Realmente no existen, como tal. Ix
define instancias para tuplas de tipos que también son instancias, y si desea pensar en tales tuplas como un tipo de índice para un Array
"multidimensional", ¡adelante! Pero todavía son solo tuplas. Obviamente, Ix
pone un orden lineal en esas tuplas, pero ¿qué es? ¿Puedes encontrar algo en la documentación que te lo diga?
Por lo tanto, creo que podemos decir con seguridad que el plegado de una Array
multidimensional utilizando el orden definido por Ix
es prudente a menos que realmente no importa qué orden a obtener los elementos en.
Para una Array
de Array
s , por otro lado, solo hay una manera sensata de combinarlos, al igual que las listas anidadas: pliegue cada Array
interior por separado de acuerdo con su propio orden de elementos, luego doble el resultado de cada uno según el orden de los elementos externos Array
.
Ahora, se podría objetar razonablemente que ya no hay distinción de tipos entre unidimensional y multidimensional Array
s, y el primero se puede suponer que tienen un ordenamiento veces sensato basado en la Ix
ejemplo, ¿por qué no usar ese orden por defecto? Ya hay una función que devuelve los elementos de Array
en una lista, después de todo.
Como resultado, la biblioteca en sí estaría de acuerdo con usted, porque eso es exactamente lo que hace la instancia Foldable
.
La diferencia entre las matrices multidimensionales y las listas anidadas es que todas las matrices tienen esencialmente el mismo tipo: 'Array Int e',' Array (Int, Int) e', 'Array (Int, Int, Int) e' .... Por lo tanto, no puede realizar una función que solo esté definida para matrices unidimensionales, mientras que 'foldr' toma una lista de listas y la procesa lista por lista, en lugar de concatenar todas las listas y procesarla elemento por elemento. –