Определение полиморфных констант в Haskell
Я читал о полиморфных константах/нулевых полиморфных функциях в Learn You A Haskell. Он привел несколько примеров встроенных, таких как:
ghci> 20 :: Float
20.0
ghci> 20 :: Int
20
ghci> minBound :: Int
-2147483648
ghci> maxBound :: (Bool, Int, Char)
(True,2147483647,'\1114111')
Однако он не объясняет, как определить свою собственную. Как они определены?
Ответы
Ответ 1
Вам нужно создать класс, включающий нужные вам функции/константы, каждый из которых имеет тип возвращаемого значения. Создайте его для каждого типа, в котором вы хотите, чтобы ваши константы могли быть.
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"
Пример использования (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"
Ответ 2
Во-первых, я рекомендую не использовать термин "константа" для обозначения не-функций, поскольку все значения являются постоянными (неизменяемыми), являются ли эти значения функциями (т.е. имеют тип функции) или нет.
Вам даже не нужны классы типов, чтобы иметь полиморфные не-функции. Пример: []
. Чтобы определить свои собственные полиморфные не-функции, вы можете определить тип данных (как в примере списка) или создать что-то из уже определенных частей. Например: empties = ([],[[]])
.