最近简要介绍了Haskell,对于monad本质上是什么,简单,简洁,实用的解释是什么?
我发现我遇到的大多数解释都是相当难以接近的,缺乏实际细节.
我发现使用C++ STL方法进行简单的集合操作非常笨重.例如,要找到两组之间的差异:
std::set<int> newUserIds;
set_difference(currentUserIds.begin(), currentUserIds.end(), mPreviousUserIds.begin(), mPreviousUserIds.end(), std::inserter(newUserIds, newUserIds.end()));
std::set<int> missingUserIds;
set_difference(mPreviousUserIds.begin(), mPreviousUserIds.end(), currentUserIds.begin(), currentUserIds.end(), std::inserter(missingUserIds, missingUserIds.end()));
mPreviousUserIds = currentUserIds;
Run Code Online (Sandbox Code Playgroud)
boost是否提供了一组替代类,可以将上面的示例缩小为:
set_type<int> newUserIds = currentUserIds.difference(mPreviousUserIds);
set_type<int> missingUserIds = mPreviousUserIds.difference(currentUserIds);
Run Code Online (Sandbox Code Playgroud)
(类似于Qt中的QSet,它operator-以这种方式覆盖.)
在这个答案中,我根据类型的is_arithmetic属性定义了一个模板:
template<typename T> enable_if_t<is_arithmetic<T>::value, string> stringify(T t){
return to_string(t);
}
template<typename T> enable_if_t<!is_arithmetic<T>::value, string> stringify(T t){
return static_cast<ostringstream&>(ostringstream() << t).str();
}
Run Code Online (Sandbox Code Playgroud)
dyp建议,不是is_arithmetic类型的属性,是否to_string为类型定义是模板选择标准.这显然是可取的,但我不知道如何说:
如果
std::to_string未定义,则使用ostringstream重载.
声明to_string标准很简单:
template<typename T> decltype(to_string(T{})) stringify(T t){
return to_string(t);
}
Run Code Online (Sandbox Code Playgroud)
这与我无法弄清楚如何构建的标准相反.这显然不起作用,但希望它传达了我正在尝试构建的内容:
template<typename T> enable_if_t<!decltype(to_string(T{})::value, string> (T t){
return static_cast<ostringstream&>(ostringstream() << t).str();
}
Run Code Online (Sandbox Code Playgroud)