It's written что кортежи 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, по сравнению с кортежем, используемым для хранения позиционных значений тех же типов аргументы конструктора значения?
Основываясь на пункте 2, кажется, что введение типа данных (в отличие от функций, которые работают от соглашения с кортежем) в основном относится к семантике, которую он вводит для потребителей модуля: способ организации мышления и чтения кода. Если производительность для этого невелика (что, я полагаю, почти всегда, учитывая повсеместность создания типов данных в Haskell), то этот дополнительный семантический выигрыш выигрывает. Но если что-то очень критично для производительности, или если это частная часть модуля, которому нужно несколько потребителей, то хорошо ли ошибаться на стороне соглашений о кортеже? – ely
Когда я говорю «соглашение о кортеже», я имею в виду функции, предназначенные для работы с кортежем, который иначе не назван или не используется в типе данных. Я так говорю, потому что (и я мог бы смутить это), похоже, что у вас не может быть рекурсивного типа данных, сделанного исключительно из 'tuple', без использования ключевых слов' data' или 'newtype', которые затем попадают эти соображения памяти, правильно? – ely
'newtype' - это только концепция времени компиляции и стирается во время компиляции. В отличие от 'data', он не накладывает на память лишний объем над типом, который он обертывает. Обновления моего ответа должны объяснить все остальное. –