Je m'excuse de ne pas avoir de bon titre pour cette question. J'ai eu des problèmes d'exprimer ce dont j'ai besoin. J'ai un simple problème dans Haskell et je me demande quelle est la meilleure approche consiste à le résoudre.
Disons que j'ai une liste de chiffres: Le problème est, bien sûr, que cela renvoie la valeur calculée (3) et non la valeur d'origine (-3). P> Je pouvais trouver une façon de le faire, cartographier la liste d'origine à un tuple de (originalValue, CalculatDvalue), trouvant le tuple dont la SND est renvoyée par ma fonction (maximum) puis de retourner la FST de ce tuple. P> Mais cela ressemble à beaucoup de "plomberie" pour un simple problème comme celui-ci, et je me demande s'il y a une abstraction qui me manque, cela résout cela. C'est-à-dire qu'il y a cette procédure généralement que je fais tout le temps et je veux un moyen de le faire soigneusement: p> Y a-t-il une fonction de bibliothèque pour cela? Existe-t-il un foncteur ou une monade pour cela? P> Je pense que je veux une fonction avec la signature: p> IE p> [- 3,2,1,2] code>. Je veux retourner la valeur avec la valeur absolue la plus élevée. C'est-à-dire que je veux retourner -3. Donc, je veux: p>
[- 3,2,1,2] code> et je veux retourner la valeur avec les abdominaux les plus élevés, alors je retournerais -3). Li>
OL> f maximum abs [-3,2,1,2]
6 Réponses :
Utilisez Matériellement, qui prend une fonction de comparaison. Vous pouvez ensuite passer une fonction qui compare la façon dont vous voulez.
maximumBy (compare `on` abs)
Ou équivalent: maximum par (comparer ABS) code>
Je préfère utiliser sur code>, car cela fonctionne avec d'autres choses, par exemple ,. (==) sur code> ABS).
Merci pour votre solution! Il y a un maximum et un minimum. Y a-t-il un fondfirstby? Je suppose qu'il y a beaucoup de fonctions qui prennent une et la transforment en un B (ABS), puis de nombreuses fonctions qui prennent une [B] et la transforment en B (maximum). Et j'essaie de trouver une façon de les composer généralement sans le cuire.
@Ara: la fonction ELEMInDex code> dans la fonction data.List code> Module donne l'index du premier élément dans une liste qui satisfait un prédicat donné. S'il n'y a pas d'élément de correspondance, rien code> est retourné. Cela pourrait être ce que vous envisagez lorsque vous parlez de FindFirstby code>.
Je crois que quelque chose sur les lignes de ce qui suit devrait fonctionner. Au-delà de la tâche à la main, vous pourriez la généraliser en résumant la fonction de comparaison et en le transmettant plus tard. p> p>
Voici quelque chose que j'ai cuisiné. C'est une sorte de meh, car elle nécessite (EQ B) , puis: p> ou: p> selectOn sum id [-3, 0, 3]
Si vous essayez d'avoir quelque chose de commandé et comparé par une projection toujours, plutôt que juste à une utilisation spécifique (auquel cas voir la réponse d'Augusts), utilisez une nouvelle wrapper: Maintenant, par exemple: p> (maximum [1,2,-3] :: AbsInt) = AbsInt (-3)
Stop ... HOILE TIME! P>
Vous avez donc une liste de choses Mettez tout ensemble: P>
et hoogle il . [a] code>. Et vous voulez vous retrouver avec juste un de ces A code>. Vous souhaitez également comparer des éléments de cette liste de manière particulière (pas leur ordre naturel), afin de déterminer qui vient en premier. C'est la partie délicate, mais vous devriez être capable de voir que ce que j'ai décrit est une fonction du formulaire a -> a -> commande code>. P>.
(A -> A -> Commande) -> [a] -> A code> p>
Maximumby CODE> et MinuünBy CODE> Les premiers hits :) HOOGLE peut être un atout puissant lorsque vous apprenez à l'utiliser. (Voir la réponse d'Augusts pour plus de détails sur l'utilisation de maximum, code> dans ce cas) p>
Une autre façon de le faire, si la conversion est un peu chère: Ce type est similaire à Nous pouvons définir un minimum avec un minimum: p> un regard sur la source de Ceci, évidemment Appelle à une analyse comparative: p> Les résultats sur mon ordinateur portable: p> ghc.extes code> 's Sortwith code> , qui nous donne un autre façon de le faire: p> Sortwith code> révèle qu'il est implémenté par Sortby code>, il manque donc de la mise en cache que la première définition pour Maximumbith p>