В Хаскеле действительно ли типы с более высоким родом * действительно * являются типами? Или они просто обозначают коллекции * конкретных * типов и ничего более?
Рассмотрим следующую функцию:
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
обозначатьтри различные типы, два из которых являются бетонными, а один - более родственным.
В Хаскеле действительно ли типы с более высоким родом действительно являются типами? Или только конкретные типы являются «реальными типами», и когда мы говорим о «типах с более высоким родом», мы просто обозначаемсемья бетонных типов. Более того, обозначают ли парамометрически полиморфные функции функцииодин типили онипросто обозначатьколлекция функцииконкретные типы (и больше ничего)?