Formulario de prefijo del operador unario en Haskell

En GHCi:

  1. Preludio> (+3) 2
    5
  2. Preludio> (* 3) 2
    6
  3. Preludio> (/ 3) 2
    0.6666666666666666
  4. Preludio> (-3) 2
    Sin instancia para (Num (t -> t1))
    que surge del literal 3' at :1:2
    Possible fix: add an instance declaration for (Num (t -> t1))
    In the expression: 3
    In the expression: (- 3) 2
    In the definition of
    3' at :1:2
    Possible fix: add an instance declaration for (Num (t -> t1))
    In the expression: 3
    In the expression: (- 3) 2
    In the definition of
    3' at :1:2
    Possible fix: add an instance declaration for (Num (t -> t1))
    In the expression: 3
    In the expression: (- 3) 2
    In the definition of
    it ‘: it = (- 3) 2

¿Cómo puedo corregir el último para que devuelva -1?

    La gramática de Haskell no te permite usar - así. Use la función de subtract lugar:

     (subtract 3) 2 

    Como nota al pie de la respuesta de grddev , aquí está el párrafo relevante del Informe Haskell 98 :

    La forma especial -e denota la negación de prefijo, el único operador de prefijo en Haskell, y es la syntax de negate (e) . El operador binario no se refiere necesariamente a la definición de - en el Preludio; puede ser recuperado por el sistema de módulos. Sin embargo, unario - siempre se referirá a la función de negate definida en el Preludio. No existe un vínculo entre el significado local del operador y la negación unaria.

    Esto es algo que me frustró cuando me enteré por primera vez: no podía entender por qué los operadores se comportaban de manera tan diferente en este contexto cuando :info (+) y :info (-) parecían básicamente idénticos.

    Podría usar subtract , como sugiere grddev, o podría definir un nuevo operador infijo:

     Prelude> let (#) = (-) Prelude> (# 3) 2 -1 

    subtract tiene la ventaja de ser familiar para otras personas que puedan leer tu código.

    Tu puedes hacer

     (-) 3 2 

    pero eso te dará 1. Para tener -1, necesitas vincular el 3 al segundo argumento de -, que puedes hacer usando

     flip (-) 3 2 

    Si intenta mantener su forma original, siempre puede agregar el negativo:

     (+ -3) 

    No es bonito, pero se ajusta a su patrón un poco más.