Comment puis-je utiliser la fonction de filtre dans Haskell?
J'ai un haskell programme à la liste de tous les entiers de [1..n], basés sur l'entrée n.
Je veux filtrer certains chiffres en fonction d'une condition et d'affichage sous forme de liste. où et comment puis-je utiliser la fonction de filtre /condition?
Selon haskell documentation:
filter :: (a -> Bool) -> [a] -> [a]
filtre appliqué à un prédicat et une liste, retourne la liste des éléments qui satisfont le prédicat; c'est à dire,
filter p xs = [ x | x <- xs, p x]
OriginalL'auteur Amjad | 2012-01-03
Vous devez vous connecter pour publier un commentaire.
Vous l'avez obtenu, à peu près. Donc, le reste de la face est de la conception de la fonction de prédicat pour votre liste. En supposant que vous avez déjà eu une liste appelée xs et une fonction de prédicat p, tout ce que vous avez à faire est de
Souvent, vous allez voir p défini comme un anonyme, ou lambda, d'expression, comme suit:
Il n'est pas nécessaire, et il peut être utile en tant que débutant pour définir les fonctions nommées.
Qui est présent [2,4].
Donc une fonction de prédicat pour une liste donnée filtre prend un élément de la liste et retourne une valeur booléenne. Si c'est vrai, l'élément est conservé (ou ajouté à la liste), et si c'est faux, il est passé au-dessus.
Vous auriez à faire une fonction le long des lignes de:
isDivisible n p = n `mod` p == 0
et de l'utiliser comme prédicat. Notez que cette fonction retourne true si le reste de la division de n par p est égal à zéro, et false sinon. Être conscient que les arguments sont maintenant dans un ordre légèrement différent de ce que vous voulez, de sorte que vous pouvez simplement retourner dans la définition de maintenant, ou utiliserflip
.Obtenez des erreurs, vous ne savez pas où pour définir ce prédicat. je pense que je ne peut pas l'utiliser dans la même ligne que le filtre de droit? Je veux que le programme pour obtenir de l'entrée et de la liste de tous ses diviseurs. je veux savoir comment le prédicat est définie pour cette. merci.
Si vous voulez savoir comment faire pour trouver tous les diviseurs d'un nombre donné, vous devez vous poser une nouvelle question à qui en particulier. Pour trouver tous les numéros dans une liste qui sont divisibles par un nombre donné, voici un moyen:
filter (\n -> n `mod` 4 == 0) list
Où la liste est la liste que vous souhaitez filtrer. Cette fonction retourne la liste des numéros dans la liste qui sont divisibles par quatre.Notez que vous pouvez aussi bien avoir défini
divisibleByFour n = n `mod` 4 == 0
à l'avance et ont filtré en tant que prédicat, mais vous avez raison - pas dans la même ligne que le filtre.OriginalL'auteur Sarah
Bien, vous transformer en un prédicat (une fonction retournant
Bool
) et l'utiliser pour filtrer les chiffres.Par exemple, si vous devez sélectionner uniquement les nombres impairs vous pouvez utiliser
filter odd [1..n]
Oui, vous avez besoin d'une fonction de type
Int -> Bool
. Votre deuxième exemple avec la liste des diviseurs de saisir les nombres ne peuvent pas fonctionner de cette façon. Parce que d'un seul numéro, vous obtenez une liste de diviseurs, donc votre fonction de typeInt -> [Int]
qui n'est pas le même queInt -> Bool
. Dans ce cas, peut-êtremap
ouconcatMap
est ce que vous souhaitez.OriginalL'auteur Mihai Maruseac