La mayoría de los lenguajes de programación funcionales (por ejemplo, Common Lisp, Scheme / raqueta, Clojure, Haskell, Scala, Ocaml, SML) soportan algunas funciones comunes de orden superior en las listas, como por ejemplo map
, filter
, takeWhile
, dropWhile
, foldl
, foldr
(véase, por ejemplo Common Lisp, Scheme / raqueta, Hoja de referencia de lado a lado de Clojure , la documentación de Haskell , Scala , OCaml y SML ).
¿C ++ 11 tiene métodos o funciones estándar equivalentes en las listas? Por ejemplo, considere el siguiente fragmento de Haskell:
let xs = [1, 2, 3, 4, 5]
let ys = map (\x -> x * x) xs
¿Cómo puedo expresar la segunda expresión en el estándar moderno C ++?
std::list<int> xs = ... // Initialize the list in some way.
std::list<int> ys = ??? // How to translate the Haskell expression?
¿Qué pasa con las otras funciones de orden superior mencionadas anteriormente?
¿Se pueden expresar directamente en C ++?
Data.Sequence
Haskell? Es comparativamente feo.[a]
. Debe ocultar la función de preludio, piratear el preludio o elegir un nombre diferente y menos intuitivo.Functor
,Foldable
yTraversable
lograr esto de una manera tan abstracta como puedo pensar.Data.Sequence
es una instancia de todos estos, por lo que puede hacerfmap (\x -> x * x) xs
.map
Estáfmap
especializado para principiantes.Respuestas:
Aún más, C ++ tiene tales funciones, eche un vistazo al encabezado del algoritmo (o con adiciones de C ++ 11 ):
Se pueden usar fácilmente con cualquier contenedor.
Por ejemplo, su código puede expresarse así (con C ++ 11 lambdas para una fácil codificación):
Menos intuitivo, pero puede ajustar fácilmente la
std::transform
llamada a una función que devolvería un nuevo contenedor (conmove
semántica para un mejor rendimiento).fuente
std::transform
toma dos iteradores, por lo tanto, puede tomar una rebanada de un contenedor (recuerde que tiene iteradores aritméticos).std::transform
como:Y<U> map(T<U>, std::function<Y(U)>)
.