Ciò è strettamente legato alla tua altra domanda circa Haskell e quicksort. Penso che probabilmente dovrai leggere almeno l'introduzione di un libro su Haskell. Sembra come se non avessi ancora afferrato il punto chiave su di esso che è che ti impedisce di modificare i valori delle variabili esistenti.
Swap (come compreso e utilizzato in C++) è, per sua stessa natura, tutto sulla modifica valori esistenti. È così che possiamo usare un nome per fare riferimento a un contenitore e sostituire quel contenitore con contenuti completamente diversi e specializzare quell'operazione per essere veloce (e senza eccezioni) per contenitori specifici, permettendoci di implementare un approccio di modifica e pubblicazione (fondamentale per scrivere codice eccezionalmente sicuro o tentare di scrivere codice senza blocco).
È possibile scrivere uno scambio generico in Haskell, ma probabilmente richiederebbe una coppia di valori e restituire una nuova coppia contenente gli stessi valori con le posizioni invertite, o qualcosa del genere. Non proprio la stessa cosa, e non avendo gli stessi usi. Non avrebbe alcun senso provare e specializzarlo per una mappa scavando all'interno di quella mappa e scambiando le sue variabili membro individuali, perché non ti è permesso fare cose del genere in Haskell (puoi fare la specializzazione, ma non la modifica delle variabili).
Supponiamo che volevamo "misura" una lista in Haskell:
measure :: [a] -> Integer
Questa è una dichiarazione di tipo. Significa che la funzione measure
prende un elenco di qualsiasi cosa (a
è un parametro di tipo generico perché inizia con una lettera minuscola) e restituisce un numero intero. Quindi questo funziona per un elenco di qualsiasi tipo di elemento: è quello che verrebbe chiamato un modello di funzione in C++ o una funzione polimorfica in Haskell (non la stessa di una classe polimorfica in C++).
Possiamo ora definire che, fornendo specializzazioni per ogni caso interessante:
measure [] = 0
cioè misurare la lista vuota e si ottiene zero.
Ecco una definizione molto generale che copre tutti gli altri casi:
measure (h:r) = 1 + measure r
Il bit tra parentesi sul lato sinistro è un modello. Significa: prendere una lista, staccare la testa e chiamarla h, chiamare la parte restante r. Questi nomi sono quindi parametri che possiamo usare. Questo corrisponderà a qualsiasi elenco con almeno un elemento su di esso.
Se hai provato la metaprogrammazione del modello in C++, questo sarà tutto vecchio per te, perché implica esattamente lo stesso stile - ricorsione per fare cicli, specializzazione per far terminare la ricorsione. Tranne che in Haskell funziona in runtime (specializzazione della funzione per particolari valori o modelli di valori).
Questo è uno scherzo, giusto? È come chiedere come si possa avere un controllo preciso su tutto in assemblea: P – ShreevatsaR
Niente a che vedere con il montaggio, davvero. Basta mantenere la stessa interfaccia con una famiglia di algoritmi. – obecalp
A parte la strana domanda sulla programmazione generica e la specializzazione parziale (cercare curriculum), la domanda sullo "scambio di variabili" è anche strana: non esiste una cosa come "scambiare il contenuto di due caselle" in Haskell, perché le variabili in Haskell sono * non * scatole con dati in esse. – ShreevatsaR