2012-10-11 29 views
20

Duplicar posible:
Currying subtraction¿Cuál es el equivalente a (+1) para la resta, ya que (-1) se ve como un número negativo?

empecé mi primer proyecto Haskell que no es de un tutorial, y por supuesto que tropiecen en las cosas más simples.

Tengo el siguiente código:

moveUp y = modifyMVar_ y $ return . (+1) 
moveDn y = modifyMVar_ y $ return . (-1) 

Me tomó algún tiempo para entender por qué mi código no se compilará: Había utilizado (-1) que es visto como uno negativo. Alterar el signo menos no ayuda, ya que lo antepone y convierte a 1 en su primer parámetro.

En resumen, ¿cuál es la versión gratuita de este punto?

dec :: Num a => a -> a 
dec x = x - 1 
+0

Ver http://stackoverflow.com/questions/4454559/currying-subtraction –

Respuesta

25

Creo que desee the conveniently-named subtract function, que existe por exactamente la razón por la que has descubierto:

subtract :: Num a => a -> a -> a 

lo mismo que flip (-).

Dado que - se trata especialmente en la gramática de Haskell, (- e) no es una sección, sino una aplicación de negación de prefijo. Sin embargo, (subtract exp) es equivalente a la sección no permitida.

Si quería escribirlo pointfree sin necesidad de utilizar una función como subtract, podría utilizar flip (-), como la documentación Prelude menciona. Pero eso es ... un poco feo.

4

Puede usar la función subtract (que está en el Preludio estándar).

moveDn y = modifyMVar_ y $ return . (subtract 1) 

También puede usar flip para reordenar los parámetros que toma -.

moveDn y = modifyMVar_ y $ return . (flip (-) 1) 
+0

+1 ... la versión de la mina no tenía flip ... –

2

Si el subtract antes mencionado es demasiado prolijo, podría intentar algo así como (+ (-1)) o (-1 +).

+2

Esto tiene la ventaja de hacer que mis dos líneas de código sean simétricas, como (+1) y (restar 1) no se ven bien uno al lado del otro. Sin embargo, esto en realidad no llama (-). Por supuesto que está totalmente bien con Num, pero si estuviera trabajando con sets que no funcionarían: agregar el elemento -1 a un conjunto no es como quitar el elemento 1. Restar es más general, pero usaré tu propuesta . Sin embargo, tendré que aceptar el uso de restar o voltear para esta pregunta, ya que es una respuesta más directa. – Niriel

+0

No estoy seguro de entender su queja, ya que (-) solo se define en las instancias de Num. (Si tuviera números no conmutativos, esto sería un problema.) – Fixnum

+6

Dado que los números parecen ser instancias de 'Enum', también podría usar 'succ' y' pred '. – Fixnum

Cuestiones relacionadas