Он написал, что кортежи Haskell - это просто другой синтаксис для алгебраических типов данных. Аналогичным образом, есть примеры переопределения конструкторов значений с помощью кортежей.
Например, тип данных дерева в Haskell может быть записан как
data Tree a = EmptyTree | Node a (Tree a) (Tree a)
который может быть преобразован в "кортеж" следующим образом:
data Tree a = EmptyTree | Node (a, Tree a, Tree a)
В чем разница между конструктором значения Node
в первом примере и фактическим tuple
во втором примере? т.е. Node a (Tree a) (Tree a)
против (a, Tree a, Tree a)
(кроме только синтаксиса)?
Под капотом есть Node a (Tree a) (Tree a)
просто другой синтаксис для 3-х кортежей соответствующих типов в каждой позиции?
Я знаю, что вы можете частично применить конструктор значений, например Node 5
, который будет иметь тип: (Node 5) :: Num a => Tree a -> Tree a -> Tree a
Вы можете частично применить кортеж, используя (,,)
как функцию... но это не знает о потенциальных типах для несвязанных записей, таких как:
Prelude> :t (,,) 5
(,,) 5 :: Num a => b -> c -> (a, b, c)
если, я думаю, вы явно объявляете тип с ::
.
Помимо синтаксических специальностей, подобных этому, плюс этот последний пример охвата типа, существует ли существенное различие между тем, что вещь "конструктор значений" фактически находится в Haskell, по сравнению с кортежем, используемым для хранения позиционных значений тех же типов, аргументы конструктора значения?