variable print functions custom argument haskell typeclass

functions - print variable haskell



Haskell: restricciones predeterminadas para escribir (1)

Considera este ejemplo:

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á predeterminado 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 Integral a => a predeterminado Integral a => a .

  • ¿Hay una manera de definir "tipos predeterminados" para otras restricciones también?
  • ¿El uso de tipos predeterminados es una mala práctica? (Se queja cuando usa -Wall ..)

Sí, puede hacerlo, aunque no es tan simple como agregar un valor predeterminado por clase de tipo, y solo funciona para Num y sus subclases en las bibliotecas estándar y de Prelude . La sintaxis es la default (t1, ..., tn) , y solo se puede utilizar una declaración por módulo.

Agregar el 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 Informe Haskell 98 . (Sin embargo, GHCi tiene reglas predeterminadas extendidas ).

Aquí hay una discusión de algunos de los problemas con el sistema actual.