Kebanyakan bahasa pemrograman fungsional (misalnya Common Lisp, Scheme / Racket, Clojure, Haskell, Scala, Ocaml, SML) mendukung beberapa fungsi umum tingkat tinggi pada daftar, seperti map
, filter
, takeWhile
, dropWhile
, foldl
, foldr
(lihat misalnya Common Lisp, Scheme / Racket, Clojure lembar referensi berdampingan , Haskell , Scala , OCaml , dan dokumentasi SML .)
Apakah C ++ 11 memiliki metode atau fungsi standar yang setara pada daftar? Misalnya, perhatikan cuplikan Haskell berikut:
let xs = [1, 2, 3, 4, 5]
let ys = map (\x -> x * x) xs
Bagaimana saya bisa mengekspresikan ekspresi kedua dalam C ++ standar modern?
std::list<int> xs = ... // Initialize the list in some way.
std::list<int> ys = ??? // How to translate the Haskell expression?
Bagaimana dengan fungsi tingkat tinggi lainnya yang disebutkan di atas?
Bisakah mereka diekspresikan secara langsung dalam C ++?
Data.Sequence
di Haskell? Ini relatif jelek.[a]
. Anda juga harus menyembunyikan fungsi pembuka, meretas pendahuluan, atau memilih nama yang berbeda dan kurang intuitif.Functor
,,Foldable
danTraversable
capai ini dengan cara abstrak yang saya bisa pikirkan.Data.Sequence
adalah contoh dari semua ini, jadi Anda bisa melakukannyafmap (\x -> x * x) xs
.map
adalahfmap
khusus untuk pemula.Jawaban:
Terlebih lagi, C ++ memiliki fungsi seperti itu, lihat header algoritme (atau dengan tambahan C ++ 11 ):
Mereka dapat dengan mudah digunakan dengan wadah apa pun.
Misalnya kode Anda dapat diekspresikan seperti ini (dengan C ++ 11 lambdas untuk pengodean yang mudah):
Kurang intuitif, tetapi Anda dapat dengan mudah membungkus
std::transform
panggilan menjadi fungsi yang akan mengembalikan wadah baru (denganmove
semantik untuk kinerja yang lebih baik).sumber
std::transform
mengambil dua iterator, jadi, Anda dapat mengambil sepotong wadah (ingat bahwa Anda memiliki iterator aritmatika).std::transform
seperti:Y<U> map(T<U>, std::function<Y(U)>)
.