recursivity - module in haskell
Haskell Pattern Matching en el conjunto vacĂo (2)
Bueno, no puedes.
Set
es un tipo de datos abstracto [0] que oculta deliberadamente su representación interna, principalmente para mantener invariantes de la estructura de datos que el sistema de tipos no puede aplicar de forma estática (específicamente, la biblioteca estándar Data.Set.Set
es un binario árbol de búsqueda).
Perder la capacidad de hacer coincidir patrones en un tipo de datos abstracto es un poco desagradable de daño colateral, pero bueno. Sus opciones son aproximadamente:
- Use predicados y guardias booleanos, por ejemplo,
null
, como en la respuesta de trinithis. - Convertir el
Set
a una lista. La mayoría de las veces esto es una tontería, pero si quieres recorrer el conjunto de todos modos, funciona lo suficientemente bien. - Habilite la extensión
ViewPatterns
de GHC , que proporciona azúcar sintáctica para usar funciones de acceso donde normalmente se aplicaría una coincidencia de patrón. - Evite realizar este tipo de comprobaciones en primer lugar: si tiene un
Set
, trátelo como un conjunto y trabaje con él como un todo para mapear, filtrar, etc. No siempre es posible, pero puede llevar a un código más limpio con menos Condicionales explícitos / iteraciones.
Ver patrones te permitiría escribir algo que se ve así:
foo (setView -> EmptySet) = []
foo (setView -> NonEmpty set) = other_thing
... donde setView
es una función que escribes. No es realmente una gran ganancia aquí, pero puede ser bueno para pseudo patrones más complejos
Para evitar las comprobaciones explícitas, además de las operaciones de conjuntos conocidas como la union
y la intersection
, considere hacer uso de las funciones de filter
, partition
, map
y fold
en Data.Set
.
[0]: vea este documento (advertencia: PDF) para la definición del término tal como lo estoy usando.
Estoy cambiando algunos códigos de Haskell de usar listas a conjuntos. Creo que entiendo todo lo que se requiere, pero no estoy seguro de cómo hacer un patrón de coincidencia en los conjuntos. Las listas tienen esta bonita sintaxis literal que parece difícil de emular con el constructor Set. Por ejemplo, podría tener un código como este:
foo [] = []
foo x = other_thing
¿Cómo puedo escribir este código para que use Conjuntos en lugar de listas?
import qualified Data.Set as Set
foo set
| Set.null set = bar
| otherwise = baz