В чем разница между конструкторами значений и кортежами?

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

Ответы на вопрос(2)

Ваш ответ на вопрос