2012-04-23 16 views
5

Me encontré con algo que encuentro curioso mientras juego con el indicador interactivo de Haskell (ghci). El siguiente código ejecuta bajo ghci 7.0.4Escriba la ambigüedad con los números

[minBound..1] 

desencadena la siguiente excepción:

<interactive>:1:12: 
    Ambiguous type variable `t0' in the constraints: 
     (Num t0) arising from the literal `1' at <interactive>:1:12 
     (Enum t0) arising from the arithmetic sequence `minBound .. 1' 
       at <interactive>:1:1-13 
     (Bounded t0) arising from a use of `minBound' 
        at <interactive>:1:2-9 
    Probable fix: add a type signature that fixes these type variable(s) 
    In the expression: 1 
    In the expression: [minBound .. 1] 
    In an equation for `it': it = [minBound .. 1] 

sé que escribir lo anterior como [minBound..1 :: Int] sería dejar claro que ' 1 'aquí debe ser Int, pero mi pregunta es, ¿dónde está la ambigüedad? '1' podría interpretarse como Int, Entero, flotador o doble, pero ninguno de ellos, excepto Int pertenecen a la clase Limita. Entonces, ¿hay otra clase en la que el literal 1 podría enmascararse? Si no, ¿entonces qué?

Respuesta

10

por la defaulting rules, una variable de tipo restringido se trató de ser resuelto por incumplimiento, si

  • todas las restricciones tienen la forma C a; a no aparece como un argumento a un constructor de tipos en la restricción, y
  • al menos una de las clases involucradas es una clase numérica, y
  • todas las clases se definen en el preludio o las bibliotecas estándar.

El tipo inferido de la expresión [minBound .. 1] es

[minBound .. 1] :: (Num a, Enum a, Bounded a) => [a] 

lo que se aplican las reglas de morosos. Pero para el incumplimiento, solo se consideran los tipos enumerados en la declaración predeterminada del módulo - a falta de una declaración predeterminada, se asume predeterminado predeterminado de (Integer, Double), es decir, para resolver una variable de tipo ambigua limitada, primero se intenta Integer , y si eso no satisface todas las restricciones, se intenta Double. Si eso no satisface todas las restricciones tampoco, el incumplimiento falla y la compilación falla con un error ambiguous type variable¹.

En el caso que nos ocupa, ni Integer ni Double cumplen la restricción Bounded, por lo que el error falla.

¹ En ghci, o con la extensión ExtendedDefaultRules habilitadas, el impago también se intenta si no hay clase numérica es una de las limitaciones, pero es Show, y el valor predeterminado por defecto se extiende por ().

+0

Buena respuesta, gracias; Estaba haciendo suposiciones acerca de cómo funciona la inferencia tipográfica de Haskell, ahora lo sé mejor – Aky