В чем разница между конструкторами значений и кортежами?
Это написано что кортежи Haskell - это просто другой синтаксис для алгебраических типов данных. Аналогично, есть примеры того, как переопределить конструкторы значений с помощью кортежей.
Например, тип данных Tree в 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» «конструктором значений», и кортеж, используемый для хранения позиционных значений тех же типов, является конструктором значений. аргументы?