Недостаток неслифтованных продуктов? - PullRequest
16 голосов
/ 21 марта 2010

В Haskell продукты с поднятым типом означают, что между (a, b, c) и (a, (b, c)) существует семантическая разница.

Если бы все совпадения образцов всех продуктов всегда были неопровержимыми, тогда не было бы никакой разницы, и (a, b, c) мог бы быть синтаксическим сахаром для (a, (b, c)).

Почему Haskell решил поднять продукты типа?

Ответы [ 3 ]

9 голосов
/ 22 марта 2010

Почему 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).

.

(Для людей, которые заботятся о затратах, структура типов также является разумным руководством по размеру типа и количеству косвенных адресов (нагрузок), необходимых для получения его элементов. Некоторым программистам нужно или нужно знать о таких вещах иметь некоторую степень контроля над ними.)

6 голосов
/ 21 марта 2010

Одна из причин заключается в том, что реализация seq для непереданного продукта требует параллельных / чередующихся вычислений, поскольку seq (a, b) True должен был бы быть True тогда и только тогда, когда хотя бы один из a и b не является -низ. Вы можете не найти эту причину ужасно убедительной, в зависимости от того, как вы относитесь к seq, но, конечно, полиморфная seq по определению является частью Haskell ...

0 голосов
/ 21 марта 2010

Вы можете создать семантическую разницу, если хотите, в связи с классами типов.

(a, b, c) и (a, (b, c)) могут создавать экземпляры классов по-разному. Просто подумай о

show (1, 2, 3)

и

show (1, (2, 3))

Я бы посчитал нелогичным, чтобы оба результата давали один и тот же вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...