Definiendo constantes polimórficas en Haskell
polymorphism (2)
He leído sobre constantes polimórficas / funciones polimórficas nulas en Learn You A Haskell . Dio varios ejemplos de incorporados, tales como:
ghci> 20 :: Float
20.0
ghci> 20 :: Int
20
ghci> minBound :: Int
-2147483648
ghci> maxBound :: (Bool, Int, Char)
(True,2147483647,''/1114111'')
Sin embargo, no explica cómo definir el suyo propio. ¿Cómo se definen?
Debe crear una clase de tipos que incluya las funciones / constantes que desee, cada una con un tipo de retorno variable. Instálalo para cada tipo que desees que puedan ser tus constantes.
class MyConstants a where
one :: a
ten :: a
instance MyConstants Int where
one = 1
ten = 10
instance MyConstants Float where
one = 1.0
ten = 10.0
instance MyConstants String where
one = "one"
ten = "ten"
Ejemplo de uso ( codepad )
main = do
putStrLn . show $ (ten :: Int)
putStrLn . show $ (one :: String)
putStrLn . show $ (ten :: Float) + one
putStrLn . show $ "Count from " ++ one ++ " to " ++ ten
10
"one"
11.0
"Count from one to ten"
Primero, recomiendo no usar el término "constante" para significar no funciones, ya que todos los valores son constantes (inmutables), ya sea que esos valores sean funciones (es decir, tengan tipo de función) o no.
Ni siquiera necesita clases de tipos para tener funciones no polimórficas. Un ejemplo es []
. Para definir sus propias funciones no polimórficas, puede definir un tipo de datos (como en el ejemplo de lista) o construir algo a partir de piezas ya definidas. Por ejemplo: empties = ([],[[]])
.