Sustracción de 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 solo iría por

 map (+1) [1..5] 

en lugar. Pero esto obviamente no funciona con (-1) ya que es negativo.

Entonces, lo primero que se me vino a la mente fue

 map (+(-1)) [1..5] 

lo cual tendría sentido considerando cómo se define la resta en el Preludio ( x - y = x + negate y ), pero parece un poco extraño para mí. Entonces me ocurrió

 map (flip (-) 1) [1..5] 

Esto de alguna manera se ve mejor para mí, pero es quizás demasiado complicado.

Ahora sé que esto no es gran cosa, pero me pregunto si me falta una forma más obvia de escribir esto. Si no, ¿cuál de las 2 formas preferirías? 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 es

 map (subtract 1) [1..5] 

seguido por

 map pred [1..5] 

sobre todo porque el primero es realmente explícito y nadie necesita adivinar / buscar lo que pred significa (predecesor).

Puede usar la función de subtract lugar de - si desea restar la sección derecha:

 map (subtract 1) [1..5] 

Dado que - tanto el infijo resta como el prefijo negar, no se puede usar la syntax (*x) (donde * es un operador infijo y el valor xa) para - . Afortunadamente, Prelude viene con negate y subtract , que es \x -> -x y \xy -> yx respectivamente, por lo que puede usar aquellos en los que necesite diferenciar entre los dos.

Creo que el map (\x -> x - 1) [1..5] transmite mejor la intención del progtwigdor, ya que no hay duda sobre qué se resta de qué. También encuentro tu primera solución, map (+(-1)) [1..5] , fácil de leer también.

No me gusta subtract porque es confusamente al revés. Sugeriría

 minus :: Num n => n -> n -> n minus = (-) infixl 6 `minus` 

Entonces puedes escribir

 map (`minus` 1) [1..5]