Większość języków programowania funkcyjnego (np Common Lisp, Scheme / rakieta, Clojure, Haskell, Scala, Ocaml, SML) obsługuje niektórych funkcji wspólnego wyższego rzędu na listach, takich jak map
, filter
, takeWhile
, dropWhile
, foldl
, foldr
(patrz np Common Lisp, Scheme / rakieta, Clojure obok siebie dokumentacja , dokumentacja Haskell , Scala , OCaml i SML ).
Czy C ++ 11 ma równoważne standardowe metody lub funkcje na listach? Weźmy na przykład następujący fragment kodu Haskell:
let xs = [1, 2, 3, 4, 5]
let ys = map (\x -> x * x) xs
Jak mogę wyrazić drugie wyrażenie we współczesnym standardowym języku C ++?
std::list<int> xs = ... // Initialize the list in some way.
std::list<int> ys = ??? // How to translate the Haskell expression?
Co z innymi funkcjami wyższego rzędu wymienionymi powyżej?
Czy można je bezpośrednio wyrazić w C ++?
Data.Sequence
w Haskell? Jest stosunkowo brzydki.[a]
. Musisz ukryć funkcję preludium, zhakować preludium lub wybrać inną i mniej intuicyjną nazwę.Functor
,Foldable
iTraversable
osiągnę to w sposób tak abstrakcyjny, jak tylko potrafię.Data.Sequence
jest ich przykładem, więc możesz to zrobićfmap (\x -> x * x) xs
.map
jestfmap
specjalistyczne dla początkujących.Odpowiedzi:
Co więcej, C ++ mają takie funkcje, spójrz na nagłówek algorytmu (lub z dodatkami C ++ 11 ):
Można je łatwo stosować z dowolnym pojemnikiem.
Na przykład twój kod może być wyrażony w następujący sposób (z lambda C ++ 11 dla łatwego kodowania):
Mniej intuicyjny, ale z łatwością można zawinąć
std::transform
wywołanie w funkcję, która zwróciłaby nowy kontener (zmove
semantyką dla lepszej wydajności).źródło
std::transform
zajmuje dwa iteratory, więc możesz wziąć kawałek kontenera (pamiętaj, że masz arytmetykę iteratorów).std::transform
jak:Y<U> map(T<U>, std::function<Y(U)>)
.