écrire "carte F (carte g xs)" comme un seul appel à mapper, vous pouvez écrire p>
exemple xs = carte (f.g) xs p> blockQuote>
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? P>
8 Réponses :
Si vous avez défini une fonction à la fois code> qui ressemblait à ceci: example xs = filter (both p q) xs
Merci mec, cela fonctionne assez certainement. pensant toujours qu'il peut y avoir une façon plus directe de le faire (?)
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: puis p>
ALLPREDICATES = (. Flip ($)). retourner tout code>
Ou le AllPredicates légèrement moins obscurcée x y = tout (flip ($) y) x code>. À quel point GHC démange-t-il efficacement des usages complexes de Flip code>? J'ai apparemment besoin de supprimer les usages de Flip code> à des fins de performance avant. Oh, John's ALLPREDICATES CODE> 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 ... code> dans data.list code> définition de Tout code>, 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
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]
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).
appeler une liste de fonctions sur quelque chose est essentiellement ce que la fonction ap code> dans Control.monad fait. Ensuite, vous venez de et code> les résultats. La seule légère laideur est que AP code> exige que ses arguments soient dans la même monade (liste dans ce cas), nous devons donc la composer avec retour code> pour fonctionner ici.
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>
C'est ce que ghc -o2 code> 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)
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
[5,6,7,8,9]
Qu'en est-il de quelque chose comme:
Vous vouliez dire, forall fs x = et [f x | F <- FS] code>. :) avec Tout code> c'est Forall fs x = Tous ($ x) fs code> (sans la carte code>). :)