Новичок в Хаскеле

Я не понимаю, почему я получаю следующий ответ от 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'

person David Kramf    schedule 30.10.2011    source источник
comment
Оба ответа абсолютно верны, но я также хочу указать, что maybe (нижний регистр m) является функцией типа b -> (a -> b) -> Maybe a -> b: функция «может быть» принимает значение по умолчанию, функцию и значение «может быть». Если значение «Возможно» равно «Ничего», функция возвращает значение по умолчанию. В противном случае она применяет функцию к значению внутри Just и возвращает результат. hackage.haskell.org/packages/ архив/база/последний/doc/html/   -  person MatrixFrog    schedule 31.10.2011


Ответы (2)


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 (заметьте, больше нет параметра типа a, т.е. все параметры типа привязаны ). Just a и Nothing являются конструкторами данных, поскольку они используются для создания экземпляров определенного типа Maybe, например, Just Int создает экземпляры Maybe Int.

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

case foo of
     Maybe a -> ...

Вам придется сказать:

case foo of
     Just a  -> ...
     Nothing -> ...
person Ionuț G. Stan    schedule 30.10.2011
comment
Кажется, что чтение учебника до сих пор оставляет меня немного запутанным между конструктором типа и конструктором данных. Синтаксис тот же и согласно приложенному абзацу из учебника Просто a также является конструктором типа (??) Параметризованные типы аналогичны универсальным или шаблонным типам в других языках. Параметризованный тип принимает один или несколько параметров типа. Например, тип Standard Prelude Maybe определяется следующим образом: data Maybe a = Nothing | Просто - person David Kramf; 31.10.2011
comment
@DavidKramf обнови мой ответ. Держите меня в курсе, если вы все еще найдете что-то неясным. - person Ionuț G. Stan; 31.10.2011
comment
@Ionuț G. Stan: a в b :: Maybe a - это не то же самое a, которое вы определили. Возможно, вам следует использовать переменные x, y вместо a, b, чтобы буквы не конфликтовали? - person Nefrubyr; 31.10.2011

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

person Chuck    schedule 30.10.2011
comment
@delnan: Да, это уже исправлено. Но спасибо, что поймали. Я имел в виду OCaml. - person Chuck; 31.10.2011