2017-10-17 9 views
-1

J'essaye d'implémenter une fonction où j'ai deux listes, la première est de n'importe quel type et la seconde est une booléenne, et je veux qu'elle retourne seulement la première liste si elle est égal à vrai. Par exemple:Comparer deux listes avec correspondance de modèle dans Haskell

pickIt [1, 2, 3] [True, False, True] returns [1, 3] 

Voici mon code:

pickIt :: [a] -> Bool -> [a] 
pickIt (x:xs) (y:ys) = (x, y) : pickIt xs ys 
pickIt _ _ = [] 

Je pense que mon type est mal, mais je suis complètement perplexe sur la façon d'aborder ce sujet. Toute aide, orientation, ou un lien pour aller dans la bonne direction serait utile.

+0

Vous devez tester si 'y' est vrai: si c'est le cas, vous renvoyez' x' suivi de la liste donnée par l'appel récursif; sinon, vous revenez juste la liste donnée par l'appel récursif. – chi

+0

'pickIt x y = [a | (a, b) <- zip x y, b] :: [a] -> [Bool] -> [a] ' – BlackCap

Répondre

2

Votre type est faux, vous avez dit que vous avez une liste de booléens (en anglais) alors votre type a dit que vous avez un seul Bool. Utilisez [Bool] au lieu de Bool.

Vous avez dit (par exemple) que vous voulez une liste de l'élément de la première liste, donc [a], en conséquence. Ensuite, votre code renverra des tuples de (a,Bool) (voir la valeur (x,y)). Au lieu de cela tester si y est vrai et seulement si par contre sur x via x:.