(首先在“bind”中的问题与std :: bind无关)
我看过Expected<T> talk,我认为这个技术的历史演示文稿缺少了哈斯克尔背后的核心思想.
Haskell的核心思想是,您“永远不会”接受“预期”的价值.你所做的是将一个lambda传递给预期的< T>这将根据预期的状态而被施加或不被应用.
我本来希望这个“绑定”组合器是预期的“T”将被使用,所以我必须问这个编程风格是否被拒绝了某些原因.我会在以下内容中调用该组合器:
template <class T> class Expected<T> { .... template <class V,class F> Expected<V> then(F fun_) { if (!valid()) { return Expected<V>::fromException(this(??)); // something like that } return fun_(get()); } }
该组合器的要点是链接一个不需要检查错误的函数列表,并且失败的第一个函数将使评估短路.
auto res = Expected<Foo>::fromCode([]() { return callFun1(...); }) .then([](Baz& val) { return callFun2(..,val,..); }) .then([](Bar& val) { return callFun3(val,...); });
或者这种语法开始类似于Haskell中使用的>> =运算符.
auto res = []() { return callFun1(...); } >> [](Baz& val) { return callFun2(..,..); } >> [](Bar& val) { return callFun3(val,...); };
callFun1返回一个预期的< Baz>,callFun2返回一个预期的<>,并且callFun3返回一个预期的< Foo>.
如您所见,此代码不检查错误.错误将停止执行,但它们仍然具有Expected< T>的所有优点.这是使用Haskell中的任何一个monad的标准方法.
正如我所说,肯定有人必须看这个.
编辑:我为callFun {1..3}写了错误的返回类型.它们对于T的各种值返回期望T,而不是T.这是T的整个点,或者>组合子.