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参数必须明确指定,但相对容易修复.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- xxx.hbm.xml文件配置详解,适合保存
- 【月伴流星】GhostW7_SP1_U_x86_V2013.06_OEM通用
- ruby-on-rails – 在Rails 3中,TDD和BDD如何相互
- 架构师之正则表达式(七)之----------以字母或者数
- SQLite学习笔记五:Order By,Group By,Having,
- ruby-on-rails – 如何解决ActiveStorage URL的N
- jmeter--正则表达式提取
- ios – 测试后的iPhone应用程序在几天后崩溃了
- 相互依赖声明(Declaration of Interdependenc)
- 是否有必要在Ruby中关闭StringIO?