¿Cómo puede (-) aparentemente tener dos tipos diferentes?

12

En ghci, cuando escribo

:t (-)

para averiguar el tipo de (-), vuelve

(-) :: Num a => a -> a -> a

Sin embargo, cuando escribo -1haskell devuelve un número, lo que parece implicar que (-)es de tipo Num a => a -> a. ¿Cómo puede (-)tener aparentemente dos tipos diferentes?

TippFehler
fuente

Respuestas:

15

Esta fue una decisión de diseño en el lenguaje. -1es un número, pero su uso en este contexto no(-) está relacionado con la función . (Como Ackdari menciona en su respuesta, este uso está relacionado con la función negate). Hay un par de compromisos que permiten que esto funcione:

  1. No puede tomar una porción derecha del (-)operador. Como solución alternativa, Haskell proporciona la subtractfunción.

  2. No puede escribir un número entero negativo sin paréntesis a menos que esté al comienzo de una tarea (por ejemplo, directamente después =o ->). Esto produce un error de análisis:

    let x = 8 * -1

    En cambio, debería escribirse como

    let x = 8 * (-1)

    Sin embargo, esto está bien:

    let x = -1 * 8

Estos se consideraron compensaciones razonables para los diseñadores del lenguaje.

Andrew Ray
fuente
8

La respuesta ya está descrita en el haskell-wiki , dice

El menos unario es el azúcar sintáctico para la función Preludio negate

entonces la función (-)es siempre la a - bfunción y si escribes código como let x = -yel compilador lo traducirá let x = negate y.

Ackdari
fuente
7

Unary minus es especial en Haskell. Como se indica en la sección 3.4 del Informe :

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

bipll
fuente
2
Las respuestas de una oración no se recomiendan en SO, al igual que los enlaces sin un resumen de su contenido, ya que pueden romperse.
Andrew Ray
¿Cómo puedo suponer que los enlaces a informes / estándares también están muy pesimizados en comparación con wikis / tutoriales / videos de youtube?
bipll
@bipll Sí. El problema con las respuestas de solo enlace no es la calidad del objetivo del enlace, sino más bien el riesgo de que se pudra el enlace. Si copió en la sección relevante del informe, entonces su respuesta estaría bien.
Joseph Sible: reinstala a Monica el