A maioria das linguagens de programação funcional (por exemplo, Common Lisp, Scheme / raquete, Clojure, Haskell, Scala, Ocaml, SML) suporta algumas funções comuns de ordem superior em listas, como map
, filter
, takeWhile
, dropWhile
, foldl
, foldr
(ver, por exemplo Common Lisp, Scheme / Racket, Folha de referência lado a lado do Clojure , a documentação de Haskell , Scala , OCaml e SML .)
O C ++ 11 possui métodos ou funções padrão equivalentes nas listas? Por exemplo, considere o seguinte snippet Haskell:
let xs = [1, 2, 3, 4, 5]
let ys = map (\x -> x * x) xs
Como posso expressar a segunda expressão no padrão C ++ moderno?
std::list<int> xs = ... // Initialize the list in some way.
std::list<int> ys = ??? // How to translate the Haskell expression?
E as outras funções de ordem superior mencionadas acima?
Eles podem ser expressos diretamente em C ++?
Data.Sequence
em Haskell? É relativamente feio.[a]
. Você precisa ocultar a função prelúdio, percorrer o prelúdio ou escolher um nome diferente e menos intuitivo.Functor
,Foldable
eTraversable
consiga isso da maneira mais abstrata possível.Data.Sequence
é uma instância de tudo isso, então você pode fazerfmap (\x -> x * x) xs
.map
éfmap
especializado para iniciantes.Respostas:
Ainda mais, o C ++ possui essas funções, consulte o algoritmo (ou com as adições do C ++ 11 cabeçalho do ):
Eles podem ser facilmente utilizados com qualquer recipiente.
Por exemplo, seu código pode ser expresso assim (com lambdas C ++ 11 para facilitar a codificação):
Menos intuitivo, mas você pode facilmente envolver a
std::transform
chamada em uma função que retornaria um novo contêiner (commove
semântica para melhor desempenho).fonte
std::transform
leva dois iteradores, portanto, você pode pegar uma fatia de um contêiner (lembre-se de que possui aritmética de iteradores).std::transform
como:Y<U> map(T<U>, std::function<Y(U)>)
.