6
votes

Haskell, filtres enchaînant

écrire "carte F (carte g xs)" comme un seul appel à mapper, vous pouvez écrire

exemple xs = carte (f.g) xs

Mais comment écririez-vous "filter P (filter q xs)" comme un seul appel à filtrer? L'opérateur DOT ne semble pas fonctionner pour filtrer comme pour les cartes. Devinez que vous utiliseriez quelque chose d'autre pour les prédicats?


0 commentaires

8 Réponses :


9
votes

Si vous avez défini une fonction à la fois code> qui ressemblait à ceci:

example xs = filter (both p q) xs


1 commentaires

Merci mec, cela fonctionne assez certainement. pensant toujours qu'il peut y avoir une façon plus directe de le faire (?)



1
votes

Je définirais une fonction d'assistance - cela pourrait probablement être écrit plus de manière déclarative, mais je n'ai pas d'installation GHCI sur ce système pour tester: xxx

puis xxx


3 commentaires

ALLPREDICATES = (. Flip ($)). retourner tout


Ou le AllPredicates légèrement moins obscurcée x y = tout (flip ($) y) x . À quel point GHC démange-t-il efficacement des usages complexes de Flip ? J'ai apparemment besoin de supprimer les usages de Flip à des fins de performance avant. Oh, John's ALLPREDICATES pourrait fonctionner assez mal puisque les fonctions récursives ne peuvent pas être inlinées. Oh étrange, il n'y a pas de où go ... dans data.list définition de Tout , ce que je suis assez sûr que vous devez avoir besoin pour l'inlinage.


Ahh non, "Transformation d'argumentation statique" le rend non récursif: Stackoverflow.com/a/9660027/667457



6
votes

Pourquoi pas une compréhension de liste?

example = [x | x <- xs, p x, q x]
-- for example
example = [x | x <- [1..10], (>3) x, x<5 ] -- [4]


2 commentaires

Ouais, la compréhension de la liste fonctionne bien ici. La question découle réellement d'un didacticiel que j'ai eu cette semaine, l'implication étant qu'il y avait une façon directe de le faire. La compréhension de la liste est la plus rapide que j'ai trouvée jusqu'à présent et je commence à penser qu'il peut y avoir de manière comparable, comme avec la carte et la "composition de la fonction". Merci a tous!


Vous pouvez toujours faire une règle de réécriture. Convertir le filtre f. Filtre G sur \ A -> Filtre (F A && G A). Bien entendu, il s'agit simplement d'un substituant pour les compréhensions de liste plus élégantes, bien que cela puisse être plus rapide (HUNCH).



4
votes

appeler une liste de fonctions sur quelque chose est essentiellement ce que la fonction ap dans Control.monad fait. Ensuite, vous venez de et les résultats. La seule légère laideur est que AP exige que ses arguments soient dans la même monade (liste dans ce cas), nous devons donc la composer avec retour pour fonctionner ici. xxx


0 commentaires

4
votes

Je définirais une expression de Lambda.

$ ghci Test.hs
GHCi, version 6.10.4: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer ... linking ... done.
Loading package base ... linking ... done.
[1 of 1] Compiling Main             ( Test.hs, interpreted )
Ok, modules loaded: Main.
*Main> main
[12,14,16,18,20]
*Main>


1 commentaires

C'est ce que ghc -o2 est automatiquement (bien presque: il existe quelques phases différentes de règles de réécriture impliquées et souvent les phases intermédiaires sont combinées à d'autres choses avant / au lieu d'être retournées dans un filtre)



9
votes
infixr 3 &&:
p &&: q = \a -> p a && q a
infixr 2 ||:
p ||: q = \a -> p a || q a
not' = (.) not
all' = foldr (&&:) $ const True
any' = foldr (||:) $ const False

example xs = filter (p &&: q ||: not' r) xs

0 commentaires

3
votes
[5,6,7,8,9]

0 commentaires

2
votes

Qu'en est-il de quelque chose comme: xxx


1 commentaires

Vous vouliez dire, forall fs x = et [f x | F <- FS] . :) avec Tout c'est Forall fs x = Tous ($ x) fs (sans la carte ). :)