Новичок Haskell

Я не понимаю, почему я получаю следующий ответ от GHCi. Разве не Maybe функция конструктора?

Prelude> :t Maybe

<interactive>:1:1: Not in scope: data constructor `Maybe'
Prelude> let e = Maybe 5

<interactive>:1:9: Not in scope: data constructor `Maybe'

Ответ 1

Maybe является конструктором типа и двумя его возможными конструкторы данных являются Nothing и Just. Поэтому вы должны сказать Just 5 вместо Maybe 5.

> let x = Just 5
> x
Just 5
> let y = Nothing
> y
Nothing
> :type x
x :: Maybe Integer
> :type y
y :: Maybe a
> :info Maybe
data Maybe a = Nothing | Just a     -- Defined in Data.Maybe
instance Eq a => Eq (Maybe a) -- Defined in Data.Maybe
instance Monad Maybe -- Defined in Data.Maybe
instance Functor Maybe -- Defined in Data.Maybe
instance Ord a => Ord (Maybe a) -- Defined in Data.Maybe
instance Read a => Read (Maybe a) -- Defined in GHC.Read
instance Show a => Show (Maybe a) -- Defined in GHC.Show

Maybe является конструктором типа, потому что он используется для построения новых типов (тип результата зависит от типа a в Maybe a), где такой тип может быть Maybe Int (обратите внимание, что нет тип param a больше, то есть все параметры типа связаны). Just a и Nothing являются конструкторами данных, поскольку они используются для создания экземпляров определенного типа Maybe, например Just Int создает экземпляры Maybe Int.

Другое существенное отличие состоит в том, что вы можете использовать конструкторы данных только при сопоставлении шаблонов. Вы не можете сказать:

case foo of
     Maybe a -> ...

Вам нужно будет сказать:

case foo of
     Just a  -> ...
     Nothing -> ...

Ответ 2

Maybe - это имя типа. Конструкторы этого типа Just и Nothing, поэтому фактическое значение типа Maybe является либо формой Just 5 (для случаев, когда есть значение, которое вы хотите вернуть), либо Nothing (для пустой случай).