2011-06-03 8 views
6

Siguiendo un ejemplo en http://en.wikibooks.org/wiki/Haskell/Beginning"Ningún caso de" error

Prelude> let abs x = if x < 0 then -x else x 
Prelude> abs 5 
5 
Prelude> abs -3 

<interactive>:1:6: 
    No instance for (Num (a0 -> a0)) 
     arising from the literal `3' 
    Possible fix: add an instance declaration for (Num (a0 -> a0)) 
    In the second argument of `(-)', namely `3' 
    In the expression: abs - 3 
    In an equation for `it': it = abs - 3 

¿Qué ocurre?

+2

La explicación del mensaje de error, solo para referencia futura: 'a0 -> a0' es el tipo de' abs'. (Escriba ': t abs' en su ghci para verlo). El mensaje de error dice que este tipo' a0 -> a0' no es una instancia de la clase de tipo 'Num', ya que solo' Num's se puede restar el uno del otro, y en cualquier caso el '3' significa que el primer argumento debe ser de algún tipo en' Num'. (En ghci escriba ': t (-)' y ': t 3' para ver qué está pasando.) La línea" en el segundo argumento de \ '(-) ', es decir \' 3' "es más reveladora: muestra que '-' está siendo tratado como un operador infijo con * dos * argumentos, no unario menos. – ShreevatsaR

Respuesta

14

Haskell cree que está tratando de restar 3 de abs, y se queja de que abs no es un número. Es necesario añadir entre paréntesis cuando se utiliza el operador de negación unaria:

abs (-3) 
+0

Batirme a él :) –

+0

Saludos. La documentación de wikibooks parece no estar disponible en varios lugares. – zaf

5

El intérprete piensa que quiere decir abs - 3 no abs (-3). Se necesitan corchetes para eliminar la ambigüedad del código y asegurarse de que está claro que tiene la intención de utilizar la función "-" unaria, no el operador de resta.

Cuestiones relacionadas