La plupart des langages de programmation fonctionnelle (par exemple , en Common Lisp, Scheme / Racket, Clojure, Haskell, Scala, Ocaml, SML) prennent en charge certaines fonctions communes d'ordre supérieur sur les listes, telles que map
, filter
, takeWhile
, dropWhile
, foldl
, foldr
(voir par exemple Common Lisp, Scheme / Racket, Clojure côte à côte , la feuille de référence , la documentation Haskell , Scala , OCaml et SML .)
C ++ 11 a-t-il des méthodes ou fonctions standard équivalentes sur les listes? Par exemple, considérez l'extrait de code Haskell suivant:
let xs = [1, 2, 3, 4, 5]
let ys = map (\x -> x * x) xs
Comment puis-je exprimer la deuxième expression en C ++ standard moderne?
std::list<int> xs = ... // Initialize the list in some way.
std::list<int> ys = ??? // How to translate the Haskell expression?
Qu'en est-il des autres fonctions d'ordre supérieur mentionnées ci-dessus?
Peut-on les exprimer directement en C ++?
Data.Sequence
à Haskell? C'est relativement moche.[a]
. Vous devez soit masquer la fonction prélude, pirater le prélude, soit choisir un nom différent et moins intuitif.Functor
,Foldable
Et yTraversable
parvenir d' une manière aussi abstraite que d' un je peux penser.Data.Sequence
est une instance de tout cela, vous pouvez donc le fairefmap (\x -> x * x) xs
.map
estfmap
spécialisé pour les débutants.Réponses:
De plus, C ++ a de telles fonctions, jetez un œil à l' en- tête de l' algorithme (ou avec des ajouts C ++ 11 ):
Ils peuvent être facilement utilisés avec n'importe quel conteneur.
Par exemple, votre code peut être exprimé comme ceci (avec des lambdas C ++ 11 pour un codage facile):
Moins intuitif, mais vous pouvez facilement envelopper l'
std::transform
appel dans une fonction qui retournerait un nouveau conteneur (avec de lamove
sémantique pour de meilleures performances).la source
std::transform
prend deux itérateurs, vous pouvez donc prendre une tranche de récipient (rappelez-vous que vous avez des arithmétiques itérateurs).std::transform
comme:Y<U> map(T<U>, std::function<Y(U)>)
.