2010-05-18 14 views
18

Considere este ejemplo:Haskell: Incumplimiento limitaciones para escribir

applyKTimes :: Integral i => i -> (a -> a) -> a -> a 
applyKTimes 0 _ x = x 
applyKTimes k f x = applyKTimes (k-1) f (f x) 

applyThrice :: (a -> a) -> a -> a 
applyThrice = applyKTimes 3 

El 3 en applyThrice está predeterminada por GHC a un Integer como se muestra al compilar con -Wall:

Warning: Defaulting the following constraint(s) to type 'Integer' 
     'Integral t' 
      arising from a use of 'applyKTimes' 

así que supongo que Integer es el predeterminado Integral a => a.

  • ¿Hay alguna manera de definir "tipos predeterminados" para otras restricciones también?
  • ¿Está utilizando los tipos predeterminados mala práctica? (Que se queja cuando se utiliza -Wall ..)

Respuesta

14

Sí, you can, aunque no es tan simple como añadir un incumplimiento por clase de tipos, y sólo funciona para Num y sus subclases en las bibliotecas Prelude y estándar. La sintaxis es default (t1, ..., tn), y solo se puede usar una de esas declaraciones por módulo.

Agregar default (Int), por ejemplo, cambiaría el valor predeterminado para Integral en su código a Int.

El valor predeterminado predeterminado de (Integer, Double) no es solo una política de GHC: es del Haskell 98 Report. (GHCi tiene extended default rules, sin embargo)

Aquí está a discussion de algunos de los problemas con el sistema actual.