2009-10-24 68 views
7

Nuevo en Haskell y tiene un obstáculo. Intento filtrar una lista de tuplas basadas en el primer elemento.Lista de filtrado de tuplas

filter (==(x,_)) lis 

Me aparece un error ilegal '_', pero no estoy seguro de cómo puedo conseguir alrededor de él?

Respuesta

19

En Haskell, no puede iterar sobre una tupla como puede hacer una lista.

Si la tupla solo tiene dos elementos, puede usar fst para recuperar el primer elemento de la tupla y snd para recuperar el segundo elemento.

Una manera de hacer lo que creo que quiere hacer es este enfoque:

Prelude> let lst = [(1,2), (3,4)] 
Prelude> filter ((==1).fst) lst 
[(1,2)] 

Lo que sólo devuelve los elementos de la lista, donde el primer elemento es igual a 1; por supuesto, se puede sustituir x donde pongo 1.

a ser un poco más específico, se aplica primero (==1).fstfst al elemento de LST, a continuación, aplica (==1) al resultado de fst - técnicamente, el punto compone las dos funciones juntas.

+0

Eso es genial, gracias. ¡Me estaba preguntando qué estaban haciendo esos. En todo el código de muestra! – Zippy

+0

Creo que los usos de (y las diferencias entre) '.' y' $ 'son uno de los obstáculos más comunes para el inicio de Haskell, así que no se preocupe, ¡usted no es el único que ha tenido problemas con eso! –

5

No se puede dar un argumento con un comodín _ en el operador == (o en cualquier otra función). El argumento debe ser un valor real, no un patrón con el que se debe comparar.

Si desea utilizar la coincidencia de patrones se puede utilizar una función lambda como filter condición:

filter (\(a,_) -> a == x) lis 

Además, no es la función predefinida fst para extraer el primer elemento de una tupla de dos elementos. Esto se puede combinar con == para hacer la misma prueba:

filter ((== x) . fst)) lis 
Cuestiones relacionadas