Ответ 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 -> ...