首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++的std :: bind2nd是否有内置的Haskell等价物?

在C++的std::bind2nd中,没有内置的Haskell等价物。

在C++中,std::bind2nd是一个函数模板,用于将一个可调用对象(如函数、函数对象、成员函数等)绑定到第二个参数上。其语法形式为:

代码语言:txt
复制
template< class F, class T1 >
auto bind2nd( F&& func, T1&& arg1 )
    -> decltype( std::bind( std::forward<F>(func), std::forward<T1>(arg1) ) );

在Haskell中,没有与std::bind2nd等价的函数。Haskell中的函数参数传递是通过值引用的,而不是引用,因此无法实现类似的功能。

如果要在Haskell中使用类似的功能,可以使用高阶函数和类型类来实现。例如,可以使用类型类来定义一个可以将函数作为参数传递的函数,并使用高阶函数来调用该函数:

代码语言:txt
复制
class Functor f => Applicative f where
  pure :: a -> f a
  (<*>) :: f (a -> b) -> f a -> f b

instance Functor ((->) r) where
  pure = const
  (<*>) f g = f . g

instance Applicative ((->) r) where
  pure = const
  (<*>) f g = f . g

然后,可以使用类似于C++中的std::bind2nd的语法来创建一个应用函数对象,并将其传递给其他函数:

代码语言:txt
复制
apply :: (Functor f, Applicative g) => f (a -> b) -> g a -> g b
apply = fmap . pure

虽然Haskell中没有与C++中的std::bind2nd等价的函数,但是可以使用类型类和高阶函数来构建类似的功能。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++】STL 算法 ⑩ ( 函数适配器 | 函数适配器概念 | 函数适配器分类 | 函数适配器辅助函数 | std::bind2nd 函数原型及示例 | std::bind 函数原型及示例 )

也可以重新排列参数顺序 , 或者将多个可调用对象组合在一起 ; C++ 11 最新引入 , 建议使用 该 绑定适配器 ; std::binder1st 绑定适配器 : 将一个二元函数对象 第一个...参数 绑定到一个特定值 , 从而创建一个新一元函数对象 ; C++ 11 弃用 , 建议使用 std::bind 绑定适配器 ; std::binder2nd 绑定适配器 : 将一个二元函数对象...第二个 参数 绑定到一个特定值 , 从而创建一个新一元函数对象 ; C++ 11 弃用 , 建议使用 std::bind 绑定适配器 ; 组合适配器 : unary_negate 组合适配器 :..., 将 二元谓词 返回值 , 进行 逻辑取反 操作 ; 二、函数适配器使用示例 - std::bind2nd 函数 1、std::bind2nd 函数原型 std::bind2nd 是一个函数适配器...与 其参数绑定到一起 , 产生一个新可调用函数对象 ; std::bind 函数适配器 比 std::bind1st 和 std::bind2nd 函数适配器更加灵活 , std::bind1st

12610

从零开始学C++之STL(九):函数适配器bind2nd 、mem_fun_ref 源码分析、函数适配器应用举例

// 这里bind2nd将二元函数对象modulus转换为一元函数对象。     ...此时可以看成是: std::binder2nd >(modulus(), 2)(*_First)  也就是调用binder2nd 类operator() 函数,返回...是元素值,value是需要绑定参数,所谓 bind2nd 也即绑定第二个参数意思,所以才说 bind2nd将二元函数对象modulus转换为一元函数对象,因为第二个参数就是2,当然 这里第一个参数就是遍历得到容器元素值了...与bind2nd 类似的还有 bind1st,顾名思义是绑定第一个参数意思,如下表达式: count_if(v.begin(), v.end(),  bind1st(less(), 4)...参考: C++ primer 第四版 Effective C++ 3rd C++编程规范

86701

C++】STL 算法 ⑪ ( 函数适配器嵌套用法 | modulus 函数对象 - 取模运算 | std::count_if 函数原型 | std::not1 函数原型 )

::count_if 函数原型 std::count_if 函数 是 C++ 标准库算法 , 该 函数 作用是 计算范围内满足特定条件元素数量 , 该函数 接受 一个迭代器范围 和 谓词函数 ;...::not1 函数原型 std::not1 是 预定义 函数适配器 函数 , 该 函数 接收一个 一员函数对象 , 返回新 一元函数对象 , 返回 一元函数对象 是对输入 一元函数对象 结果...std::bind1st 或 std::bind2nd 嵌套使用 , 创建更复杂谓词 ; 2、代码示例 - 函数适配器嵌套用法 核心代码如下 : // 计算 vector 容器中 , 值为 2 个数..., 返回 0 或 1 可以当做 二元谓词 ; bind2nd(modulus(), 2) 将 二元谓词 中 第二个元素进行了绑定 , 只需要接收一个参数 , 变成了 一元谓词 ; not1...(bind2nd(modulus(), 2)) 将 上述 一元谓词 取反 , 得到一个新一元谓词 ; 代码示例 : #include "iostream" using namespace std

10210

C++ 中文周刊 第74期

c++bind和网络库bind符号冲突了。很搞笑。不过在linux环境下没有这个问题 我之前在windows平台遇到过log日志接口和cmathlog函数符号冲突。...这里你可以自主控制,力度更精细一些 C xor C++ Programming 同一个代码段 c和c++很大区别。主要是逗号表达式,左值右值,位域,类型转换,类型大小,空类型,匿名结构体等等。...但是这个推导可能不是我们预想那样 std::string s = "foo"; assert(!...轻松拼凑出可用微服务,内置http/grpc hspp Haskell Style Programming brought to C++ 不懂haskell 不评价 flecs 又一个ECS框架 YACLib...+ at runtime static_functional 工作招聘 有没有需要看大门,要被毕业了 ---- 看到这里或许你建议或者疑问或者指出错误,请留言评论!

28630

C++ 动态新闻推送 第48期

C++ 动态新闻推送 第48期 从reddit/hackernews/lobsters摘抄一些c++动态 周刊项目地址|在线地址 | 腾讯云+社区 标准委员会动态/ide/编译器信息放在这里 编译器信息最新动态推荐关注...; // oops } 其他场景,比如const引用传参数(大对象)该用用,没问题 Design and evolution of constexpr in C++ 介绍constexpr演化 Span...- making C arrays fun since 2020 能用std::span就用,std::span做接口可以兼容std::array 内置c数组,std::vector,且前两个,最终效果一致...,大大隐藏了内置数组坑爹效应 Micro C, Part 1: Parsing 教你用llvm和haskell写c编译器 Writing a simple 16 bit VM in less than...(), input.cend(), doStuff); 没啥说,c++17东西 视频 Branchless Programming in C++ - Fedor Pikus

48720

c++基础语法

c和c++联系 c++代码可以混编c代码,既可以写c也可以调用c c++面向对象,c面向过程 开源框架大部分都是基于c++ 打印 #include "stdio.h" #include print(); //调用友元函数 changeAge(stu, 37); stu->print(); delete(stu); getchar(); } 友元类 :java反射获取属性可以理解为就是一个...指向常量末尾指针: vec.cend(); 元素访问 下标访问: vec[1]; //并不会检查是否越界 at方法访问: vec.at(1); //以上两者区别就是at...java 中把对象添加到了集合,c++ 中会调用对象拷贝构造函数,存进去是另一个对象 在c++中将对象加入到容器,需要有默认构造函数 析构函数也可能回调用多次,如果说在析构函数中释放内存,需要在拷贝构造函数中进行深拷贝

1.5K30

C++过于复杂为何不被淘汰?

当你不需要自己设计内存分配机制,就完全不需要理会allocator这个听起来就不是很简单东西,放心地使用STL内置default部分。...在你不熟悉FP时候,完全可以不去考虑lambda表达式,不去考虑std::function,不去写那些高阶函数。...但是当你觉得想把Lisp和Haskell中有些概念比如闭包、monad等搬到C++时,你会觉得其实这些东西蛮顺手。 这多么人性化!...啊,牛顿力学。只要你不涉及到速度、质量足够大场景,就不需要相对论; 流体力学是不是太复杂啦?我们需要简单啊,简单流体力学。只要你不涉及湍流,就不要考虑数值求解内维尔-斯托克斯方程。...我们需要简单啊,普通量子力学。只要你不涉及复杂多体交换关联势,你就不需要学习高量和重正化群。 C++是不是太复杂啦? 得啦,当你面对问题还都不涉及到你暂时用不到内容时,C++够简单啦。。。

65210

【笔记】C++标准库: 体系结构与内核分析(下)

这篇是侯捷关于C++标准模板库课程《C++标准库: 体系结构与内核分析》笔记, 上一篇在此, 课程内容大家自己找吧....如果是原生指针, 使用萃取器判断指针指向元素是否特殊拷贝构造函数, 如果只有默认拷贝的话我们就也可以用内存复制来处理 如果有特殊拷贝构造, 我们就必须用循环逐个拷贝构造....+ ((seed>2)); } 了这个hash函数, 对于我们自己类型, 只要传递所需一些可被std::hash()处理成员进去就可以得到一个合适hashcode...而为了让自己类型可以被std::hash()处理, 可以在std内追加一个适合自己类型偏特化模板函数: // 追加在std内方便处理 namespace std{ // 给自己类型偏特化一份...例如is_void::value会回答当前询问是否为空, 值是0或1.

76720

C++ 新特性学习(四) — Bind和Function

绑定函数是我认为C++新标准里第二有用库了 绑定库使用环境是: GCC-C++ 4.3 及以上 Visual Studio 2008 SP1 及以上 BOOST 1.25及以上(其中function...playButton.onClick(0); return 0; } // 以上代码参考boost中bind库示例代码,在G++ 4.6.1中测试通过 木有错,这是C++,并且很方便地实现了委托...这就是传说中绑定库和增强型函数对象 接下来一个一个来 Bind 可用于绑定函数、成员函数、函数对象、成员变量 这是老标准中std::bind1st和std::bind2nd增强版,这两个函数只能且必须绑定一个带有两个参数...占位符不匹配将会在调用时编译错误 绑定对象必须是函数或成员函数指针 绑定对象默认为c++函数且不支持变长参数函数,如printf,某些编译器上extern “C”函数(如: std::strcmp...std::function作用就在于把函数或函数对象转换成function对象,并用于保存和后期调用。 其中和std::bind配合使用例子上面已经了,就不重复。

2.3K10

C++ STL 标准模板库(排序集合适配器)算法

C++ 标准模板库STL,是一个使用模板技术实现通用程序库,该库由容器container,算法algorithm,迭代器iterator,容器和算法之间通过迭代器进行无缝连接,其中所包含数据结构都是目前最优解...,该库既能保证软件代码高可复用性,又能保证代码具有相当高执行效率,STL库是ANSI/ISOC++标准具体实现,任何标准库实现都是以源码形式释出....STL是C++一部分,STL可分为容器(containers)、迭代器(iterators)、空间配置器(allocator)、配接器(adapters)、算法(algorithms)、仿函数(functors...STL 排序/算数/集合算法 C++ 排序算法是一组将无序序列排列成有序序列模板函数或与排序相关模板函数,排序算法一般要求容器提供随机访问迭代器,这里将分别学习常用排序算法,集合中/交集/并集/...argc, char* argv[]) { vector var = {1,2,3,4,5,6,7,8,9,10}; for_each(var.begin(), var.end(),bind2nd

62630

编程语言具备哪些特性?

许多 C++程序员在使用 Java 时编写了功能完备且合理面向对象代码,但是 C++臃肿却不能很好地满足 Java 中优雅(即使 C++程序员可能认为它除了 Java 「缺陷」之外大多是优雅)...Haskell 遇到了一个「神秘元组问题」,因为尽管类型定义非常严格,但是每个函数中组件可以不同名称。...有趣是,当 GO 被显式地替换为 C++时,结果喜欢 C++程序员发现,C++ 在复杂程度上很高,这使得他们感觉自己是宇宙主宰,除了 Haskell 之外,他们永远不会换用任何其他语言。...我使用了 yacc/lex(和 GNU 等价物 bison/flex)以及 Javacc。...事务内存,类似于许多语言附加组件,而 Culjure 内置 我不知道我会选哪一个,它们都有各自优势。

2K10

C++ 动态新闻推送 第1期

c++23 herb介绍了几个他感兴趣小补丁 lambda可以省略括号(),但是如果有mutable又不可以省略括号了,需要修订 range使用:std::views::join迭代器返回问题,引入新组件修复...trip report中引用论文看详细细节 c++20 运行时拿到函数名,使用lambda和std::source_location 感觉能用在反射上 之前c++ weekly也讨论了std::source_location...第二种方法 用到了std::exclusive_scan 可以了解下,类似haskell map+scanl clang一个编译告警-Wsuggest-override 这里讲了一个场景 struct...还有很多设计可以在readme中看到 讨论 工具 toolchain 介绍周边工具 hacking cpp 很多c++资料,比如https://hackingcpp.com/cpp/std/containers.html...---- 看到这里或许你建议或者疑问或者指出错误,请留言评论!

47610

Microsoft开源跨平台序列化库——Bond

目前该项目已经基于宽松MIT许可开源在了GitHub上,当前版本支持C++、C#和Python,可运行在Linux、OS-X和Windows平台上。Bond编译器完全是使用Haskell编写。...用户能够以插件方式定制核心架构逻辑之外内容——是从Bond模式还是从自定义类型序列化、有线格式是什么、是否将自定义元数据放到有效负载中等等。...例如,在C++中默认是std::vector这样STL容器,但是用户能够很容易地映射自定义类型——在一个生成C++结构体中使用Pythonboost::multi索引容器或者在一个生成C++类中将一个...Bond生成C++结构体还能使用自定义分配器。...Stack Overflow上一个帖子对Bond和Google Protocol Buffers做了一个非常好比较: 优点: Bond支持泛型  Bond不同类型用于表示集合:vector,

1.2K60

什么是好编程语言?

许多 C++程序员在使用 Java 时编写了功能完备且合理面向对象代码,但是 C++臃肿却不能很好地满足 Java 中优雅(即使 C++程序员可能认为它除了 Java 「缺陷」之外大多是优雅)...Haskell 遇到了一个「神秘元组问题」,因为尽管类型定义非常严格,但是每个函数中组件可以不同名称。...有趣是,当 GO 被显式地替换为 C++时,结果喜欢 C++程序员发现,C++ 在复杂程度上很高,这使得他们感觉自己是宇宙主宰,除了 Haskell 之外,他们永远不会换用任何其他语言。...我使用了 yacc/lex(和 GNU 等价物 bison/flex)以及 Javacc。...事务内存,类似于许多语言附加组件,而 Culjure 内置 我不知道我会选哪一个,它们都有各自优势。

2.6K20

STL小结

C++标准库一个重要组成部分,它由Stepanov and Lee等人最先开发,它是与C++几乎同时开始开发;一开始STL选择了Ada作为实现语言,但Ada有点不争气,最后他们选择了C++C++...只用于对象指针和引用。当用于多态类型时,它允许任意隐式类型转换以及相反过程。dynamic_cast会检查操作是否有效。也就是说,它会检查转换是否会返回一个被请求有效完整对象。...greater (),其实就是">"号,是一个2元函数 bind2nd两个参数,要求一个是2元函数,一个是数值,结果是一个1元函数。 bind2nd就是个函数适配器。...SGI使用时std::alloc作为默认配置器。...一些temp结构体后,执行clear这样是否会内存泄露?

81510
领券