haskell - Sustracción de curry
coding-style (4)
Creo que el map (/x -> x - 1) [1..5]
transmite mejor la intención del programador, 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.
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).
Dado que -
tanto el infijo resta como el prefijo negar, no se puede usar la sintaxis (*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.
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]
Puede usar la función de subtract
lugar de -
si desea restar la sección derecha:
map (subtract 1) [1..5]