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.