Парамаметрически полиморфные функции
Рассмотрим следующую функцию:
f :: a -> Int
f x = (1 :: Int)
Мы могли бы сказать, что тип f
- это a -> Int
, и, следовательно, f
имеет "полиморфный" тип.
Что из следующего является наиболее точным способом думать о f
?
Фактически существует сингл
f
типаa -> Int
. Однако его можно использовать какf :: Int -> Int
, какf :: Double -> Int
и так далее.Буквально говоря, тип
f
НЕa -> Int
. В самом деле, это всего лишь сокращенный способ обозначить, что существует семейство функцийf
, чей тип конкретен (т. Е. Существуетf :: Int -> Int
,f :: Double -> Double
и т. Д.; Более того, каждая из этих функций отличается друг от друга).
Высшие родственные типы
Точно так же мы можем рассмотреть следующее объявление типа:
data Maybe a = Just a | Nothing
И спросите, какое из двух представлений более правильное:
Не существует одиночного типа
Maybe
; действительно, существует просто семейство конкретных типов (Maybe Int
,Maybe String
и т. д.) и ничего более.Существует фактически единственный тип
Maybe
. Этот тип относится к более высокородным. Когда мы говорим, что это «тип», мы имеем в виду буквально (не как сокращение для (1)). Так уж получилось, что мы также можем написатьMaybe Int
,Maybe Double
и т. Д. Для создания различных типов (которые оказываются конкретными). Но, в конце концов (т.е.):Maybe
,Maybe Int
иMaybe String
обозначают три различных типа, два из которых являются конкретными, а один - более высокородным.
Резюме вопроса
В Haskell, действительно ли «высокодородные типы» являются типами? Или «настоящими типами» являются только конкретные типы, и когда мы говорим о «высокодородных типах», мы просто обозначаем семейство конкретных типов. Более того, парамаметрически полиморфные функции обозначают функции одного типа или они просто обозначают коллекцию функций конкретных типов em> (и не более того)?