haskell coding-style

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]