2012-01-03 5 views
5

Bien, tal vez el título es un poco confuso, pero lo que intento hacer es tener una función como esta: f (a:b:c:d:is) = ... pero ser capaz de consultar a:b:c:d sin escribirlo de nuevo. Como resultado, no puedo hacer algo como [email protected](a:b:c:d):is y obtener el resultado esperado. ¿Algunas ideas?Usar patrones como no vinculantes para la Lista completa en Haskell

+0

Querrá usuario la sintaxis correcta, e @ (a: b: c: d: es) – Sarah

+0

Oh, ya veo a lo que te refieres Si está usando (e @ (a: b: c: d): is), entonces se trata de una lista de listas donde d es la cola de las listas internas. No creo que puedas ayudar con esto como patrones, ya que los parens para agrupar serán necesarios. – Sarah

Respuesta

6

Lo mejor que puedo pensar es el uso de view patterns, así:

{-# LANGUAGE ViewPatterns #-} 
f (splitAt 4 -> ([email protected][a,b,c,d], is)) = is ++ [d,c,b,a] ++ as 
+0

+1, eso es lo mejor que no pude pensar en OTTOMH. –

+1

Puede evitar el lenguaje pragma simplemente usando protectores de patrones. "f xs | (e @ [a, b, c, d], es) <- splitAt 4 xs = e" – Sarah

+0

Esperaba algo tan "limpio" como as-patterns, pero gracias de todos modos. – byrondrossos

5

No se puede hacer eso, una razón es que a:b:c:d no es una expresión bien tipada. Por la unión en la definición de f, a, b, c, d todos tienen el mismo tipo, responda t, pero el tipo de la lista constructor es

(:) :: t -> [t] -> [t] 

Puede ordenar de lograr lo que quiere mediante la unión let foo = take 4 inputList. Es cierto que es torpe, pero no puedo pensar en nada mejor en la parte superior de mi cabeza.

+0

+1 para explicar el problema. –

Cuestiones relacionadas