Эквивалент создания объектов в Хаскеле - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь понять, как используется следующее:

data Maybe a = Nothing | Just a
data Either a b = Left a | Right b

Насколько я понимаю, это параметризованные алгебраические типы данных .Исходя из ОО-фона, я бы сейчас хотел создать экземпляр этих объектов.Если я сделаю что-то вроде:

x = Maybe 10

Это теперь подкласс / sub-algebraic-data-type, или интересно, как называется этот объект.Я бы предположил, что это тип в некотором роде.Если так, то мне интересно, как создать экземпляр из x.На ОО-земле я бы сделал:

myinstance = new x

Это то, что из-за прихода на Хаскелл я теряюсь, и я не уверен, где искать.Несколько вопросов для подведения итогов:

  1. Что за объект x выше.Если Maybe является параметризованным типом данных, то x имеет тип ~ что-то ~ , не уверен.
  2. Как создать экземпляр x.
  3. Чтоявляется экземпляром x для Maybe, поскольку мы передали его 10. Интересно, если значение экземпляра равно 10 и имеет тип Int.

Ответы [ 3 ]

0 голосов
/ 22 мая 2018

Что за объект х выше.Если 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 |
 +----+
0 голосов
/ 22 мая 2018

Когда вы пишете определение алгебраического типа как

data Maybe a = Nothing | Just a

, LHS является выражением конструирования типа (в нем говорится, что Maybe имеет вид * -> *), а RHS является дизъюнкцией альтернатив.один из которых является конструктором значения , поэтому для типа Maybe a Just является унарным конструктором, который создает объект этого типа, а Nothing является нулевым.

0 голосов
/ 22 мая 2018

В Хаскеле нет такой вещи, как Maybe 10.Существует Maybe Int, который является типом .

Мы создаем значение определенного типа, напрямую , как

x :: Maybe Int
x = Just 10

или

y :: Maybe Int
y = Nothing

Простойи прямой.


edit: Maybe является конструктором типа .Just и Nothing являются конструкторами данных .Написав Maybe Int, мы «создаем» тип.Не может быть определения z :: Maybe ; z = ......

Это известно как "kind": тип Maybe равен * -> *, в то время как, например, Int s * и такMaybe Int s.Попробуйте :k в приглашении GHCi, чтобы увидеть это:

~> :k Int
Int :: *

~> :k Maybe
Maybe :: * -> *

~> :k Maybe Int
Maybe Int :: *

Конечно, мы не создаем новый тип, когда пишем "Maybe Int, просто Maybe сам по себе не является типомвещей пока нет (типы "вещей" имеют вид *).

Определение для Maybe - это то, что создает типы Maybe a для любых a, которые мы можем использовать.Это известно как параметрический полиморфизм.

Так что в Хаскеле у нас нет объектов (в смысле ООП).У нас есть значения и типы.

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