Resta al curry
Si queremos mapear una función que aumenta cada elemento de un rango en 1, podríamos escribir
map (\x -> x + 1) [1..5]
pero supongo que la mayoría de la gente simplemente iría por
map (+1) [1..5]
en lugar. Pero esto obviamente no funciona con (-1) ya que es negativo.
Así que lo primero que me vino a la mente fue
map (+(-1)) [1..5]
lo que tendría sentido teniendo en cuenta cómo se define la resta en el Preludio (x - y = x + negate y
), pero me parece un poco extraño. Entonces se me ocurrió
map (flip (-) 1) [1..5]
Esto de alguna manera me parece mejor, pero tal vez sea un poco demasiado complicado.
Ahora sé que esto no es gran cosa, pero me pregunto si me estoy perdiendo una forma más obvia de escribir esto. Si no, ¿cuál de las 2 formas preferiría? Realmente solo pregunto porque a menudo son pequeños detalles como este los que hacen que su código sea más idiomático y, por lo tanto, agradable para otros desarrolladores que tienen que leerlo.
Solución
Ahora que tengo un par de respuestas, creo que mi favorito personal es
map (subtract 1) [1..5]
seguido por
map pred [1..5]
principalmente porque el primero es realmente explícito y nadie necesita adivinar / buscar quépred
significa (predecesor).