Связь между различными типами в Haskell - PullRequest
0 голосов
/ 22 мая 2018

Насколько я понимаю, в Haskell есть 4 "типа":

  • Алгебраический тип данных с data
  • Конструкторы типов данных (что после = в типах data; технически не типизирую, я не думаю)
  • Псевдоним типа с type
  • Классы типов с class
  • Напечатайте экземпляры с помощью instance

Вопросы:

  1. Если в Haskell есть больше видов типов.Если да, то какие существуют отношения.
  2. В чем разница между типом data и типом class.Они кажутся похожими, хотя, очевидно, у них есть некоторые разные особенности.То же самое с (3).
  3. В чем разница между типом data и экземпляром класса типов instance.

Я новичок в Haskell.

Ответы [ 2 ]

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

Возможно, вы слышали о разновидностях , которые являются "типами типов" в Haskell.Тип - это что-то с видом *, представляющее вещи, которые могут иметь значения:

> :kind Int
Int :: *
> :kind Char
Char :: *

Конструкторы типов - это вещи с видом * -> *;конструктор типа принимает тип (что-то типа *) и возвращает другой тип.

> :kind Maybe
Maybe :: * -> *
> :kind []
[] :: * -> *

Применение конструктора типа дает вам новую вещь типа *:

> :kind Maybe Int
Maybe Int :: *
> :kind [] Float
[] Float :: *

(синтаксический анализатор допускает [Foo] как особый случай для [] Foo.)

Есть и другие вещи, которые также являются разновидностями.Одним из них является Constraint, и вы создаете Constraint с помощью конструктора ограничений (иначе называемого классом типов).Присвойте конструктору ограничения тип, и вы получите ограничение.

> :kind Show
Show :: * -> Constraint
> :kind Show Int
Show Int :: Constraint
> :kind Show (Int -> Char)
Show (Int -> Char) :: Constraint

(Обратите внимание, что последний правильно родится, хотя экземпляр для Int -> Char не определен.)


В этом свете => выглядит как оператор, а не как специальный синтаксис.Его аргументы - это «список» ограничений (хотя и использующих универсально квантифицированные переменные типа вместо конкретных типов) и тип, а его возвращаемое значение является «ограниченным» типом (давайте представим, что есть тип ConstrainedType в дополнение к *, * -> * и Constraint).

:t show
show :: Show a => a -> String

-- Taking extreme liberties with syntax
-- :k (=>)
-- (=>) :: [Constraint] -> * -> ConstrainedType
-- A section?
-- :k (Show a =>)
-- (Show a =>) :: * -> ConstrainedType
-- :k (Showa => * -> String)
-- Show a => a -> String :: ConstrainedType
0 голосов
/ 22 мая 2018

data и newtype вводят новые типы (или фактически конструкторы типов - Maybe не является типом, но Maybe a является типом для любого a, являющегося типом).

Объявление data вводит как новый тип (что осталось от =), так и способ представления данных этого типа (что справа от =).

Так, например,если у вас есть объявление данных, подобное этому:

data SomeType = SomeConstructor

Затем вы ввели новый тип с именем SomeType и способ создания значений SomeType, а именно конструктор SomeConstructor (который, кстати,не имеет никаких параметров, поэтому это единственное значение, присущее этому типу).

Класс типов не выполняет или этих вещей (как и instance).Класс типов вводит ограничение и набор полиморфных функций, которые должны быть доступны при соблюдении этого ограничения.instance в основном говорит, что «этот тип удовлетворяет этому ограничению», предоставляя реализацию для этих функций.Так что class на самом деле не вводит новые типы, это просто способ обеспечить специальный полиморфизм для существующих типов.

Например, класс типов Show примерно такой:

class Show a where -- a is an instance of Show if
   show :: a -> String -- it has a function called show with this signature

(Обратите внимание, что класс Show в Prelude не вполне выглядит так)

show теперь имеет тип Show a => a -> String, который выможно прочитать как

для всех a, если они удовлетворяют ограничению Show (или, альтернативно, если они являются экземпляром Show), то эта функция принимает a и возвращаетстрока

Экземпляр для этого будет выглядеть так:

instance Show SomeType where
  show SomeConstructor = "SomeConstructor"

Это означает, что

SomeType удовлетворяет ограничению Show, иЯ покажу вам, как обеспечить реализацию show

Это примерно суть.Существуют языковые расширения, которые позволяют более сложным вещам происходить с классами типов и экземплярами, но пока вам не нужно об этом беспокоиться.

...