2011-05-08 12 views
5

¿Qué es un patrón 'anidado' en Haskell. Escucho el término en todas partes pero no estoy seguro de lo que realmente significa. ¿Cómo lo definirías? ¿Algún ejemplo?¿Qué es un patrón anidado en Haskell?

Gracias de antemano.

editar para agregar: (como se cita en los libros de texto bajo petición)

"Los patrones pueden contener literales y patrones anidados, como en los ejemplos:

addPair (0,y) = y 

addPair (x,y) = x+y 


shift :: ((Int,Int),Int) -> (Int,(Int,Int)) 

shift ((x,y),z) = (x,(y,z)) 
+0

Supongo que podría tener algo que ver con la lógica recursiva que se usa mucho en Haskell. – Pieter

+0

@Pieter debería ser más simple que eso – maclunian

+2

¿Cuidados para citar un ejemplo de lo que escuchas? Que yo sepa, no hay un significado canónico asociado a este término. – Ingo

Respuesta

6

Esto significa que puede hacer coincidir en contra de un patrón que contiene otro patrón En el ejemplo, el patrón (x, y) está contenida dentro de la mayor ((x, y), z) patrón de la anidación puede ser arbitrariamente profundo, por ejemplo, todos los siguientes son legales:..

f ((x2,x0),x1)     =() 
f' (((x3, x2),x0),x1)   =() 
f'' ((((x4,x3), x2),x0),x1)  =() 
f''' (((((x5,x4),x3), x2),x0),x1) =() 

y así sucesivamente. Esto también se extiende a las listas y tipos de datos algebraicas:

f [[x]] =() 
f' [[[x]]] =() 

g (Just (Just x))  =() 
g' (Just (Just (Just x))) =() 

Aquí, f toma una lista de listas, f' toma una lista de listas de listas, g toma un Maybe que contiene otro Maybe (es decir, Maybe (Maybe a)), y g' toma un Maybe (Maybe (Maybe a))

+0

elabora si puedes por favor? – maclunian

+0

ah, estoy empezando a obtenerlo ahora;) – maclunian

+0

Tenga en cuenta que esta es una fraseología infeliz, en mi humilde opinión - porque anidamiento generalmente se asocia con ámbitos léxicos, pero las variables en los patrones deben ser lineales no importa qué tan "anidado" es el patrón. Por lo tanto, el término * subpatrón * puede ser mejor (en analogía a * subexpresiones *). – Ingo

0

Aunque puedo estar equivocado, sólo puedo suponer que a partir del contexto de un patrón de "anidada" sería algo así como addPair x = x o addPair x y = x+y. Tus argumentos, creo que son un patrón. En la mayoría de los lenguajes de programación, esto sería un simple x y. mientras que en este caso su patrón de argumento puede ser más complicado, p. (x, y) o ((x, y), z).

Anidar probablemente significa "una tupla o lista" o "una tupla o lista no plana".

Cuestiones relacionadas