2011-09-26 9 views
15

¿Hay alguien que pueda explicarme por qué no se ha definido el tipo de datos Set en Haskell?¿Por qué no hay un tipo de datos Set integrado en Haskell?

Sidenote: Estoy aprendiendo Haskell como parte de un curso de lógica en el que la teoría de conjuntos es muy importante, por lo que sería muy útil tener la noción de un conjunto en Haskell. Tener una lista y eliminar duplicados (y posiblemente clasificar) resultaría en un conjunto también, pero tengo curiosidad si hay una razón particular por la que no está incorporado.

+3

** Nota del moderador ** Los comentarios bajo esta pregunta fueron mayormente ruido, o una reacción al ruido y se eliminaron. Por favor, mantenga los comentarios constructivos y sobre el tema. –

+0

Veo respuestas/comentarios que sugieren el uso de listas en su lugar. una lista no es un reemplazo eficiente para el conjunto. el tiempo para encontrar un elemento en una lista desordenada crece con el tamaño de la lista, en un conjunto, se espera que sea constante. – ribamar

Respuesta

26

Como indican otras respuestas, la pregunta "¿Por qué no hay ningún tipo de datos Establecer en Haskell?" está equivocado: there is a Set data type.

Si desea saber por qué Set no está "incorporado" a Haskell, podría estar preguntándole una de dos cosas.

  • ¿Por qué Set no es parte de language specification?
  • ¿Por qué Set no está en Prelude (las funciones y los tipos de datos que se importan por defecto)?

Para responder a la primera, es porque el lenguaje es lo suficientemente potente como para expresar la idea de un conjunto sin necesidad de cocer en. Al ser un lenguaje con un gran énfasis en la programación funcional, sintaxis especial para tuplas y listas está integrado, pero incluso los tipos de datos simples como Bool se definen en Preludio.

Para responder a esto último, una vez más, con énfasis en la programación funcional, la mayoría de los Haskellers tienden a usar listas. La lista de la mónada representa una elección no determinista y, al permitir duplicados, puede ordenar las opciones ponderadas.

Nota how similar list comprehension syntax is to set notation. Siempre puede usar Set.fromList para convertir una lista en un conjunto "real", si es necesario. Como un grito a regañadientes a Barry, esto sería similar al método de Python set(); Python tiene listas de comprensión también.

+0

Técnicamente, 'Data.Set' está en GHC, pero no está en los informes de Haskell 98 o 2010 – user102008

+0

@ user102008" in GHC "? Está en el [paquete de contenedores] (http://hackage.haskell.org/package/containers), que está incluido en la [Plataforma Haskell] (http://hackage.haskell.org/platform/), pero yo ' No estoy seguro de lo que quiere decir al decir que está "en GHC". –

+0

@ DanBurton, el paquete 'containers' con el GHC, incluso si no se obtiene la plataforma. – ivanm

9

Existe como Data.Set. Sin embargo, como dijiste, puede implementarse encima de list y no es necesario para crear el idioma que, creo, es el motivo por el cual está en un módulo en lugar de ser parte de la definición del lenguaje en sí.

+0

Bueno, las listas también se podían definir usando otras cosas también ... –

+0

@DietrichEpp sí, pero la sintaxis sería muy pesada si se agrega a la lista de escritura como una cadena explícita de contras. – mb14

+1

@ mb14 '(:) == Contras; solo hay azúcar sintáctica para listas finitas explícitas y como envoltorios alrededor de varias funciones 'enum {From} {Then} {To}'. – ivanm

11

En un nivel más filosófico --- nunca puede haber una correspondencia estricta entre el concepto matemático de un conjunto y la implementación de un conjunto Haskell. Por qué no? Bueno, el sistema de tipos, para empezar. Un conjunto matemático puede tener cualquier cosa: {x | x is a positive integer, i < 15} es un conjunto, pero también lo es {1, tree, ham sandwich}. En Haskell, un Set a necesitará tener un tipo determinado. Poner dobles y flotantes en el mismo conjunto no hará una comprobación de tipo.

Como han dicho otros, si necesita hacer algunas cosas como un conjunto y no le importa la restricción de tipo, Data.Set existe. No está en Preludio porque las listas son usualmente más prácticas. Pero realmente, desde la perspectiva del diseño del lenguaje, no tiene sentido pensar en conjuntos matemáticos como un tipo de datos entre muchos. Los conjuntos son más fundamentales que eso. No tiene juegos, números y listas; tienes conjuntos de números y conjuntos de listas. El poder de los tipos recursivos tiende a oscurecer esa distinción, pero sigue siendo real.

Hay un lugar en Haskell, donde definimos colecciones arbitrarias, y luego definimos funciones sobre esas colecciones. El análogo más cercano al concepto matemático de conjuntos en Haskell es el sistema de tipos en sí mismo.

+1

Muchas veces, los conjuntos en las matemáticas se consideran en el contexto de un "universo" (http://en.wikipedia.org/wiki/Universe_(mathematics)) – user102008

+0

@ Zopa: aún se puede expresar que con un resumen tipo. – ivanm

+0

Es verdad, como dices, que "en Haskell, un 'Set a' necesitará mantener algún tipo particular". Pero el tipo en el que se ejemplifica 'a' podría ser de tipo existencial, de los cuales' 1', 'tree' y' ham sandwich' podrían ser miembros, suponiendo que 'tree' y' ham sandwich' están bien tipados términos ... lo que podría hacer de manera significativa con un conjunto así no tengo ni idea;) Sin embargo, estoy de acuerdo con su conclusión, que _types mismos_ son lo más parecido que Haskell tiene a la noción matemática de conjuntos. –

Cuestiones relacionadas