微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – 有人使用预期的monadic绑定样式编程

(首先在“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的整个点,或者>组合子.

解决方法

将正常的函数传递给C中的函数模板(比如你的.then),而不是Haskell,这是非常令人沮丧的.如果他们重载或模板,您必须为他们提供一个明确的类型签名.这是丑陋的,不适用于单轨计算链.

此外,我们目前的羔羊是单形的,你必须明确地输出参数类型,这使得整个情况更糟.

有许多(库)尝试使C中的函数式编程更容易,但总是归结为这两点.

最后但并非最不重要的是,C中的功能式编程不是规范,有很多人对于这个概念是完全陌生的,而“返回代码”的概念很容易理解.

(请注意,您的.then函数模板的V参数必须明确指定,但相对容易修复.)

原文地址:https://www.jb51.cc/c/114973.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐