F#代码
C++代码
#include <iostream>
#include <list>
#include <string>
#include <algorithm>
#include <boost/assign.hpp>
#include <boost/optional/optional.hpp>
#include <boost/spirit/home/karma.hpp>
using namespace std;
using namespace boost::assign;
using boost::optional;
namespace fsharp_list
{
template<typename Fn, typename T>
auto map(Fn mapping, list<T> const& list1) -> list<decltype(mapping(declval<T>()))>
{
list<decltype(mapping(declval<T>()))> list_result(list1.size());
transform(list1.cbegin(), list1.cend(), list_result.begin(), mapping);
return list_result;
}
template<typename Fn, typename T>
auto choose(Fn chooser, list<T> const& list1) -> list<typename remove_reference<decltype(*chooser(declval<T>()))>::type>
{
list<typename remove_reference<decltype(*chooser(declval<T>()))>::type> list_result;
for_each(list1.cbegin(), list1.cend(),
[&](T const& elem){
if(auto v = chooser(elem))
list_result.push_back(*v);
}
);
return list_result;
}
}
namespace std
{
namespace karma = boost::spirit::karma;
template<typename T>
ostream& operator<<(ostream& os, list<T> const& list1)
{
return os << karma::format('[' << -(karma::auto_ % "; ") << ']', list1);
}
}
int main()
{
list<int> list1 = list_of(1)(2)(3);
auto newList = fsharp_list::map([](int x){return x + 1;}, list1);
cout << newList << endl;
//[2; 3; 4]
list<string> listWords = list_of<string>("and")("Rome")("Bob")("apple")("zebra");
auto isCapitalized = [](string const& str){return str[0] >= 'A' && str[0] <= 'Z';};
auto results = fsharp_list::choose(
[&](string const& elem){
return isCapitalized(elem) ? optional<string>(elem) : optional<string>();
}, listWords
);
cout << results << endl;
//["Rome"; "Bob"]
}