2011-01-31 14 views
26

Soy nuevo en Haskell, lo siento si esta es una pregunta básica.Haskell: Compruebe si el int. Está en una lista de int.

Actualmente tengo una lista de Int y estoy intentando crear una función que toma una variable xy devuelve un booleano dependiendo de si la variable existe en la lista.

He tenido una búsqueda y encontré la función Data.List find pero este dosent parece devolver un valor booleano.

Estoy usando GHCi.

Gracias,

Respuesta

67

en primer lugar el tipo de la función que necesita.

"Comprobar si" significa devolver verdadero o falso, un Bool.

Así que la función toma un Int, una lista de Int (también conocido como [Int]) y devuelve Bool:

Int -> [Int] -> Bool 

Ahora ask hoogle.

elem :: Eq a => a -> [a] -> Bool 

Hoogle es una herramienta muy útil. Puede integrate it with ghci.

+5

Preguntando google llévame aquí. No tienes que ser duro con OP. – fotanus

+6

¿Cómo puedo mejorar el tono de la respuesta? No estaba tratando de ser duro. – AtnNn

+10

Malo, leí "preguntar a google" :-D – fotanus

15

Si la función estándar elem no existía, podría haber estado en el camino correcto con find.

myElem :: (Eq a) => a -> [a] -> Bool 
myElem x = maybe False (const True) . find (== x) 

Hay un montón de otras maneras de ponerlo en práctica también, como

myElem x = any (== x) 
myElem x = or . map (== x) 
myElem x = not . null . filter (== x) 
myElem x = foldr (\y b -> y == x || b) False 

etc.

0

lo hice más simple como esto.

l=[1,2,3,4,5] 


checkIfElem :: Int -> [Int] ->Bool 
checkIfElem x l 
     |x`elem` l =True 
     |otherwise=False 
+12

Eso es realmente simple, pero también se podría decir que es una forma increíblemente complicada de escribir la definición 'checkIfElem = elem', ¡porque es _exactamente_ equivalente a eso! (Los guardias ya verifican los valores booleanos, '| condition = True'' | otherwise = False', por lo tanto, es simplemente '= condition'. Eso te deja con' checkIfElem xl = elem xl', donde con η-reduction puedes soltar los argumentos en ambos lados.) – leftaroundabout

+0

No creo que esto sea simple. –