Что за объект х выше.Если Maybe - это параметризованный тип данных, то x - это ~ что-то ~, не уверен.
Вы не можете построить Maybe 10
, вы можете, например, построить Just 10
.В случае, если 10
здесь Int
(технически это может быть любой числовой тип, но давайте пока проигнорируем это), тогда вы создали Maybe Int
.
Обратите внимание, что a
в Maybe a
на один мета уровень выше: он работает с типами.Следовательно, a
является параметром type .Таким образом, он принимает не значение 10
, а, например, Int
.
. То, что вы можете сделать, однако, это определить псевдоним типа для Maybe Int
Например:
<b>type</b> X = Maybe Int
Обратите внимание, что здесь мы используем type
в качестве псевдонима типа, не data
для создания типа данных.
Типы (и вводить псевдонимы) всегда начинаются с верхнего регистра, поэтому мы не можем определить тип x
, только тип X
.Тип имеет no конструктор по умолчанию (что обычно имеет место в языках программирования OO).
Как создать экземпляр x.
Haskell может получить самый общий тип самого выражения.Таким образом, мы пишем выражение, которое имеет тип Maybe Int
, например,
Just 10
В случае, если тип будет слишком общим (здесь это будет Num a => Maybe a
), мы можем дать подсказкуHaskell, используя два последовательных двоеточия (::
), например:
Just 10 :: Maybe Int
или поскольку мы уже ввели псевдоним типа X
:
Just 10 :: X
Что такоеэкземпляр x для Maybe, поскольку мы передали его 10. Интересно, если значение экземпляра равно 10 и имеет тип Int.
Welll, как уже было сказано, типы в Haskell имеют no конструктор по умолчанию.Здесь у нас есть два кандидата: Just n
с n
и Int
(если мы используем тип X
) или Nothing
.Поэтому мы выбираем одно из двух:
Just 10 :: X
Nothing :: X
Поскольку вы не можете изменять состояние объекта после его создания (т. Е. Все объекты в Haskell являются неизменяемыми), это означает, чтобыло бы странно, что конструктор по умолчанию устанавливает некоторые начальные данные, а затем более поздние методы изменят этот объект.
Таким образом, вы можете увидеть конструктор данных (здесь Just
и Nothing
) как помеченный контейнер, который содержит группу параметров в контейнере и помечает его тем, какой конструктор был использован.Таким образом, графическое представление объектов будет:
+------+ +---------+
| Just | | Nothing |
+------+ +---------+
| o |
+---|--+
|
v
+----+
| 10 |
+----+