Esto está estrechamente relacionado con su otra pregunta sobre Haskell y quicksort. Creo que probablemente necesites leer al menos la introducción de un libro sobre Haskell. Parece como si aún no hubiera captado el punto clave al respecto, que es que le impide modificar los valores de las variables existentes.
Swap (como se entiende y se usa en C++) es, por su propia naturaleza, todo sobre la modificación de los valores existentes. Es así que podemos usar un nombre para referirnos a un contenedor, y reemplazar ese contenedor con contenidos completamente diferentes, y especializar esa operación para que sea rápida (y sin excepciones) para contenedores específicos, lo que nos permite implementar un enfoque de modificar y publicar (crucial para escribir código de excepción o intentar escribir código sin bloqueo).
Puede escribir un intercambio genérico en Haskell, pero probablemente tomaría un par de valores y devolvería un nuevo par que contenga los mismos valores con sus posiciones invertidas, o algo así. No es realmente lo mismo, y no tiene los mismos usos. No tendría ningún sentido tratar de especializarlo para un mapa cavando dentro de ese mapa e intercambiando sus variables de miembros individuales, porque simplemente no se te permite hacer cosas como esas en Haskell (puedes hacer la especialización, pero no la modificación de variables).
Supongamos que queremos "medida", una lista en Haskell:
measure :: [a] -> Integer
Esa es una declaración de tipo. Significa que la función measure
toma una lista de cualquier cosa (a
es un parámetro de tipo genérico porque comienza con una letra minúscula) y devuelve un Entero. Así que esto funciona para una lista de cualquier tipo de elemento: es lo que se llamaría una plantilla de función en C++, o una función polimórfica en Haskell (no es lo mismo que una clase polimórfica en C++).
Ahora podemos definir que al proporcionar especializaciones para cada caso interesante:
measure [] = 0
es decir, medir la lista vacía y se obtiene cero.
Aquí es una definición muy general que abarca todos los demás casos:
measure (h:r) = 1 + measure r
El bit entre paréntesis en la LHS es un patrón. Significa: tomar una lista, romper la cabeza y llamarla h, llamar a la parte restante r. Esos nombres son entonces parámetros que podemos usar. Esto coincidirá con cualquier lista con al menos un elemento en ella.
Si ha intentado la metaprogramación de plantillas en C++, todo esto será obsoleto, ya que involucra exactamente el mismo estilo: recurrencia para hacer bucles, especialización para terminar la recursión. Excepto que en Haskell funciona en tiempo de ejecución (especialización de la función para valores particulares o patrones de valores).
Esto es una broma, ¿verdad? Esto es como preguntar cómo puede tener un control preciso sobre todo en el ensamblaje: P – ShreevatsaR
Nada que ver con el ensamblaje, realmente. Simplemente mantenga la misma interfaz con una familia de algoritmos. – obecalp
Además de la extraña pregunta sobre la programación genérica y la especialización parcial (buscar currying), la pregunta sobre "intercambiar variables" también es extraña: no hay nada como "intercambiar el contenido de dos cuadros" en Haskell, porque las variables en Haskell son * no * cuadros con datos en ellos. – ShreevatsaR