Определение полиморфных констант в Haskell - программирование
Подтвердить что ты не робот

Определение полиморфных констант в 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')  

Однако он не объясняет, как определить свою собственную. Как они определены?

4b9b3361

Ответ 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 = ([],[[]]).