Почему в Haskell нет встроенного набора данных?
Есть ли кто-нибудь, кто может объяснить мне, почему нет типа Set
datatype, определенного в Haskell?
Sidenote:
Я только изучаю Haskell как часть курса по логике, в котором теория множеств очень важна, поэтому было бы очень полезно иметь понятие набора в Haskell. Наличие списка и удаление дубликатов (и, возможно, сортировка) также приведет к набору, но мне любопытно, есть ли какая-то причина, почему он не встроен?
Ответы
Ответ 1
Как показывают другие ответы, вопрос "Почему в Haskell нет заданного типа данных?" ошибочно: есть тип данных Установить.
Если вы хотите знать, почему Set
не встроен в Haskell, вы можете задать одну из двух вещей.
- Почему
Set
не является частью спецификации ?
- Почему
Set
не находится в Prelude (функции и типы данных, которые импортируются по умолчанию)?
Чтобы ответить на первое, это потому, что язык достаточно мощный, чтобы выразить идею набора без необходимости его испечь. Будучи языком с большим упором на функциональное программирование, специальный синтаксис для кортежей и списков построен в, но даже простые типы данных, такие как Bool
, определены в Prelude.
Чтобы ответить на последнее, опять же, с акцентом на функциональное программирование, большинство Haskellers имеют тенденцию использовать списки. Монада списка представляет собой недетерминированный выбор, и, разрешая дубликаты, вы можете отсортировать взвешенные варианты.
Заметьте как синтаксис синтаксиса списка должен установить нотацию. Вы всегда можете использовать Set.fromList
для преобразования списка в "реальный" набор, если это необходимо. Как низводящий крик Барри, это будет похоже на использование метода Python set()
; У Python есть также списки.
Ответ 2
На более философском уровне --- никогда не может быть строгого соответствия между математической концепцией набора и реализацией набора Хаскелла. Почему нет? Ну, система типа, для начала. Математический набор может иметь в себе что-то вообще: {x | x is a positive integer, i < 15}
- это набор, но это также {1, tree, ham sandwich}
. В Haskell a Set a
нужно будет удерживать определенный тип. Вставка парных разрядов и поплавков в один и тот же набор не будет проверяться typecheck.
Как говорили другие, если вам нужно делать некоторые подобные вещи и не иметь против ограничения типа, Data.Set существует. Это не в Prelude, потому что списки обычно более практичны. Но на самом деле, с точки зрения дизайна языка, нет смысла думать о математических наборах как о одном типе данных среди многих. Наборы являются более фундаментальными, чем это. У вас нет наборов, номеров и списков; у вас есть наборы чисел и наборы списков. Сила рекурсивных типов имеет тенденцию скрывать это различие, но она по-прежнему реальна.
В Haskell есть место, где мы определяем произвольные коллекции, а затем определяем функции над этими коллекциями. Ближайшим аналогом математической концепции множеств в Haskell является сама система типов.
Ответ 3
Он существует как Data.Set
. Однако, как вы сказали, он может быть реализован поверх list
, поэтому нет необходимости создавать язык, который, как мне кажется, является причиной того, что он находится в модуле, а не является частью определения самого языка.