Почему Haskell решил поднять продукты типа?
Вы можете обосновать этот выбор дизайна, не обращаясь к лени или опровержимым образцам.
Такой же дизайн выбора сделан ML по причинам поддержки полиморфизма. Рассмотрим
fst (x, y) = x
snd (x, y) = y
Теперь, если (a, (b, c))
является синтаксическим сахаром для (a, b, c)
, довольно сложно понять, как специализировать fst
и snd
для принятия этого типа в качестве аргумента. Но
fst :: (a, (b, c)) -> a
snd :: (a, (b, c)) -> (b, c)
вполне разумно. Поскольку полиморфные функции, такие как fst
и snd
, невероятно полезны, и Haskell, и ML дают программисту возможность отличать (a, (b, c))
и ((a, b), c)
от (a, b, c)
.
.
(Для людей, которые заботятся о затратах, структура типов также является разумным руководством по размеру типа и количеству косвенных адресов (нагрузок), необходимых для получения его элементов. Некоторым программистам нужно или нужно знать о таких вещах иметь некоторую степень контроля над ними.)