Dal momento che si parla la differenza tra un "multidimensionale" Array
e un Array
di Array
s, che illustreranno il punto di bene, a fianco di un confronto con le liste.
Una piega (nel senso di classe Foldable
) è un'operazione intrinsecamente lineare, proprio come le liste sono una struttura intrinsecamente lineare; una piega destra caratterizza completamente una lista facendo corrispondere i suoi costruttori uno-a-uno con gli argomenti a foldr
.Mentre è possibile definire funzioni come foldl
, c'è una chiara scelta di una piega canonica standard.
Array
non ha una struttura trasparente che possa essere abbinata in una sola volta in una piega. È un tipo astratto, con accesso a singoli elementi forniti da valori di indice, che possono essere di qualsiasi tipo che abbia un'istanza Ix
. Quindi non solo non esiste un'unica scelta ovvia per implementare una piega, non esiste anche una struttura lineare intrinseca. Succede così che Ix
ti consente di enumerare un intervallo di indici, ma questo è più un dettaglio di implementazione che altro.
Che dire di multidimensionale Array
s? Non esistono davvero, in quanto tali. Ix
definisce le istanze per le tuple di tipi che sono anche istanze e se vuoi pensare a tuple come un tipo di indice per un "multidimensionale" Array
, vai avanti! Ma sono ancora solo tuple. Ovviamente, Ix
mette un ordine lineare su quelle tuple, ma che cos'è? Riesci a trovare qualcosa nella documentazione che ti dice?
Quindi, penso che possiamo tranquillamente dire che piegando un multidimensionale Array
utilizzando l'ordine definito dalla Ix
è saggio a meno che non si ha realmente importa in che ordine si ottiene gli elementi in.
Per un Array
di Array
s , d'altra parte, c'è un solo modo ragionevole per combinarli, proprio come gli elenchi annidati: piegare ogni interno Array
separatamente in base al proprio ordine di elementi, quindi piegare il risultato di ciascuno secondo l'ordine degli elementi Array
esterno.
Ora, si potrebbe ragionevolmente obiettare che, poiché non c'è alcun tipo di distinzione tra una dimensione e multidimensionale Array
s, e l'ex può essere assunta per avere un ordinamento piega ragionevole sulla base dell'istanza Ix
, perché non basta usare quell'ordine di default? C'è già una funzione che restituisce gli elementi di un Array
in un elenco, dopo tutto.
Come risulta, la libreria stessa sarebbe d'accordo con te, perché è esattamente ciò che fa l'istanza Foldable
.
La differenza tra gli array multidimensionali e gli elenchi annidati è che tutti gli array hanno essenzialmente lo stesso tipo: 'Array Int e',' Array (Int, Int) e', 'Array (Int, Int, Int) e' .... Quindi non puoi creare una funzione che è definita solo per matrici monodimensionali, mentre 'foldr' prende una lista di liste e la elabora lista per lista, invece di concatenare tutte le liste ed elaborarla elemento per elemento. –