std::some-namespace::transform 有一天可以支持任何函子吗?

2023-11-22

std::transform来自<algorithm> header适用于范围,它“使”我们能够使用范围作为它们的函子(从范畴论的意义上来说(¹)). std::transform是基于迭代器的,是的,但是std::ranges::views::transform不是,它的签名与函数语言中相应函数的签名非常匹配(对两个参数的不同顺序取模,但这没什么大不了的)。

当我看到这个问题(并且在这个过程中回答它),我了解到C++23引入了std::optional<T>::transform,这使得std::optional也是一个函子。

所有这些消息确实让我兴奋,但我不禁想到函子是通用的,如果有一个统一的接口就好了transform任何函子,例如 Haskell 中的情况。

这让我认为一个类似于std::ranges::views::transform(使用不同的名称并不是暗示ranges)可以做成定制点STL 不仅可以针对范围进行定制,还可以针对std::optional对于 STL 中的任何其他仿函数,而程序员可以为其用户定义的类自定义它。

类似地,C++23 也引入了std::optional<T>::and_then,这基本上是一元绑定std::optional。我不知道有任何类似的函数可以实现范围的单子绑定,但是 C++20 的some_range | std::ranges::views::transform(f) | std::ranges::views::join本质上是一元绑定some_range with f.

这让我觉得可能有一些通用接口,命名它mbind,可以选择任何类型。 STL 将选择加入std::optional通过实施它std::optional<T>::and_then, 例如。

该语言是否有机会或有计划有一天支持这种通用性?


I can certainly see some problems. Today std::ranges::views::transform(some_optional, some_func) is invalid, so some code might be relying on that via SFINAE. Making it suddenly work would break the code. No quite, breaking code that relies on SFINAE-based detection of invalid code is ok.


(1) 关于这个词functor,我指的是范畴论中给出的定义(另见this),而不是“具有以下特征的类的对象”的概念operator()定义”;后者在标准中没有定义甚至没有提到参考参数,它使用术语函数对象参考

可以在函数调用运算符左侧使用的对象


这让我觉得可能有一些通用接口,命名它mbind,可以选择任何类型。 ...

该语言是否有机会或有任何计划 天支持这样的通用性吗?

P0650它提出了一个非成员一元接口,可以使用特征进行定制。该论文显示了定制expected和其他类型,可在 C++17 中实现。

已接受的提案std::optional单元操作P0798 §13.1在讨论成员函数语法的替代方案时参考 P0650:

不幸的是,如果没有某种 Haskell 风格,按照当前的提案进行上述的组合将会非常冗长do符号

std::optional<int> get_cute_cat(const image& img) {    
   return functor::map(
       functor::map(
         monad::bind(
           monad::bind(crop_to_cat(img),
             add_bow_tie),
           make_eyes_sparkle),
        make_smaller),
     add_rainbow);
 }

我的建议不一定是[P0650]的替代方案;可以确保两者之间的兼容性,并且通用提案可以使用我的提案作为其实施的一部分。

它还提到仍在开发中的其他 C++ 功能(例如统一调用语法)如何为通用一元操作提供更简洁的语法。

已接受的提案std::expected单元操作P2505没有直接引用 P0650,而是讨论“自由函数与成员函数”作为其设计考虑的一部分,最终优先考虑与std::optional一元接口。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

std::some-namespace::transform 有一天可以支持任何函子吗? 的相关文章

  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • 为什么大多数 C 开发人员使用 Define 而不是 const? [复制]

    这个问题在这里已经有答案了 在许多程序中 define与常量具有相同的用途 例如 define FIELD WIDTH 10 const int fieldWidth 10 我通常认为第一种形式优于另一种形式 它依赖于预处理器来处理基本上是
  • 32 位应用程序的特征最大矩阵大小

    所以 我正在寻找Eigen http eigen tuxfamily org index php title Main Page当我尝试声明大于 10000x10000 的矩阵时 包崩溃 我需要声明一个像这样的矩阵 可靠地大约有 13000
  • 使用post方法将多个参数发送到asp.net core 3 mvc操作

    使用 http post 方法向 asp net mvc core 3 操作发送具有多个参数的 ajax 请求时存在问题 参数不绑定 在 dot net 框架 asp net web api 中存在类似的限制 但在 asp net mvc
  • 如何使用recv()检测客户端是否仍然连接(并且没有挂起)?

    我写了一个多客户端服务器程序C on SuSE Linux 企业服务器 12 3 x86 64 我为每个客户端使用一个线程来接收数据 我的问题是 我使用一个终端来运行服务器 并使用其他几个终端来运行服务器telnet到我的服务器 作为客户端
  • 暂停下载线程

    我正在用 C 编写一个非常简单的批量下载程序 该程序读取要下载的 URL 的 txt 文件 我已经设置了一个全局线程和委托来更新 GUI 按下 开始 按钮即可创建并启动该线程 我想要做的是有一个 暂停 按钮 使我能够暂停下载 直到点击 恢复
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • 如何从 C# 控制器重定向到外部 url

    我使用 C 控制器作为网络服务 在其中我想将用户重定向到外部网址 我该怎么做 Tried System Web HttpContext Current Response Redirect 但没有成功 使用控制器的重定向 http msdn
  • 如何从网站下载 .EXE 文件?

    我正在编写一个应用程序 需要从网站下载 exe 文件 我正在使用 Visual Studio Express 2008 我正在使用以下代码 private void button1 Click object sender EventArgs
  • 如何将“外部模板”与由同一类中的模板化成员使用的嵌套类一起使用?

    首先 一些背景信息 我尝试以 Herb Sutter 在他的解决方案中介绍的方式使用 Pimpl 习语 得到了 101 http herbsutter com gotw 101 这在头文件中看起来像这样 include pimpl h h
  • 基于xsd模式生成xml(使用.NET)

    我想根据我的 xsd 架构 cap xsd 生成 xml 文件 我找到了这篇文章并按照说明进行操作 使用 XSD 文件生成 XML 文件 https stackoverflow com questions 6530424 generatin
  • 通过 NHibernate 进行查询,无需 N+1 - 包含示例

    我有一个 N 1 问题 我不知道如何解决它 可以在这个问题的底部找到完全可重复的样本 因此 如果您愿意 请创建数据库 设置 NUnit 测试和所有附带的类 并尝试在本地消除 N 1 这是我遇到的真实问题的匿名版本 众所周知 这段代码对于帮助
  • 当我“绘制”线条时,如何将点平均分配到 LineRenderer 的宽度曲线?

    我正在使用线条渲染器创建一个 绘图 应用程序 现在我尝试使用线条渲染器上的宽度曲线启用笔压 问题在于 AnimationCurve 的 时间 值 水平轴 从 0 标准化为 1 因此我不能在每次添加位置时都在其末尾添加一个值 除非有一个我不知
  • 获取 2 个数据集 c# 中的差异

    我正在编写一个简短的算法 它必须比较两个数据集 以便可以进一步处理两者之间的差异 我尝试通过合并这两个数据集并将结果更改放入新的数据集来实现此目标 我的方法如下所示 private DataSet ComputateDiff DataSet
  • g++ 对于看似不相关的变量“警告:迭代...调用未定义的行为”

    考虑以下代码strange cpp include
  • 当前的 x86 架构是否支持非临时加载(来自“正常”内存)?

    我知道有关此主题的多个问题 但是 我没有看到任何明确的答案或任何基准测量 因此 我创建了一个处理两个整数数组的简单程序 第一个数组a非常大 64 MB 第二个数组b很小 无法放入 L1 缓存 程序迭代a并将其元素添加到相应的元素中b在模块化
  • strcmp 给出分段错误[重复]

    这个问题在这里已经有答案了 这是我的代码给出分段错误 include
  • WinRT 定时注销

    我正在开发一个 WinRT 应用程序 要求之一是应用程序应具有 定时注销 功能 这意味着在任何屏幕上 如果应用程序空闲了 10 分钟 应用程序应该注销并导航回主屏幕 显然 执行此操作的强力方法是在每个页面的每个网格上连接指针按下事件 并在触
  • Googletest:如何异步运行测试?

    考虑到一个包含数千个测试的大型项目 其中一些测试需要几分钟才能完成 如果按顺序执行 整套测试需要一个多小时才能完成 通过并行执行测试可以减少测试时间 据我所知 没有办法直接从 googletest mock 做到这一点 就像 async选项
  • 错误:无效使用不完整类型“类 Move”/未定义对 Move::NONE 的引用

    拜托 我不知道为什么这个简单的代码被拒绝 它给了我 2 个编译错误 请帮帮我 I use 代码 块 20 03 我的编译器是GNU GCC 移动 hpp class Move public Move Move int int public

随机推荐

  • 如何在 LLDB 断点条件下使用堆栈内容?

    问题 我遇到过这样一种情况 我们在启动期间进行媒体播放 并且 objc exception throw 在此期间点击了大约 5 次 但总是被捕获 并且它是way媒体播放器对象的南边 我厌倦了 a 必须手动继续 n 次 或 b 必须禁用断点直
  • 将 Textview 添加到 FrameLayout 的确定位置

    我正在尝试添加一个textView to a frameLayout The TextView has wrap content属性 因此它会随着文本的增长而增长 我将其添加到FrameLayout有了这个功能 FrameLayout fi
  • Java中从磁盘备份和恢复sqlite到内存

    我正在尝试将 sqlite 文件读入内存以获得更好的性能 当关闭我的应用程序时 我想将其写回硬盘 我正在使用jdbc 3 7 2 Java 驱动程序 根据文档 我的代码看起来像 this conn DriverManager getConn
  • 如何使用自动布局在 MKAnnotation 中显示多行?

    我正在使用 Mapkit 如何多行输入MK注释视图 每个注释都有标题和副标题 我如何在以下的帮助下显示多行副标题自动布局 我找到了答案 请尝试我的答案 我们只需要编写代码 MKAnnotationView mapView MKMapView
  • Jade:加载外部javascript并调用函数

    我正在学习 Express Node Jade 现在在 Jade 文件中我想包含一个来自公共文件夹的 javascript 文件 仅用于该页面 例如 在 jade 文件中我输入以下内容 script src javascripts test
  • Delphi XE2 FireMonkey 是否支持 Indy 跨平台应用程序?

    看看带有 Firemonkey 的新 Delphi XE2 考虑到它是针对 Windows Mac OSX 和 iOS 进行编译的 VCL 组件在 FireMonkey 应用程序中毫无用处 我的问题是 是否有 将会有 Indy Firemo
  • 如何从 Dart http 调用返回 json / 如何完全使用流?

    这是我的代码 应该返回 json 我从这里改编了这段代码https github com flutter flutter issues 15110 Stream defaultReturn HttpClientResponse httpCl
  • MissingSecret [MissingSecretError]:请在生产中定义一个“秘密”

    根据文档https next auth js org configuration options secret 添加一个NEXTAUTH 秘密作为环境变量 您不必定义此选项 但在 vercel 制作中我仍然得到 2022 03 24T10
  • 访问元组中元素的时间复杂度

    关于哈希 字典 和列表也有类似的问题 这里还有一条很好的信息 http wiki python org moin TimeComplexity 但我没有找到任何关于元组的信息 访问时间为 data structure i 对于链表来说一般是
  • 如何更改指针的默认图像

    我需要使用一些自定义图像更改光标 指针的默认图像 创建一个类并指定光标的悬停值不是一个有效的解决方案 因为我必须将该类添加到所有已创建的元素中 并且您知道吗 这并不完全是最佳的 也无法将该类添加到主体中 因为带有光标的子级 指针会覆盖它 知
  • 清除 Python 的命令行输出 [Eclipse]

    我正在使用 Eclipse 编写 Python 并且我希望能够轻松地清除屏幕 我见过这个问题 并尝试了 除其他建议外 以下解决方案 import os def clear os system cls if os name nt else c
  • vector> 无法使用 MSVC 进行编译

    制作仅移动类型的地图向量似乎在 Windows 上无法正常工作 请参阅此处的代码 https godbolt org z yAHmzh include
  • Golang 的 SQL 包无法进行即席/探索性查询吗?

    根据文档 从 Go 中的数据库中获取数据的唯一方法似乎是使用 Rows Scan 这意味着您必须在编译时知道所有列的计数和类型 我错过了什么吗 您应该如何支持即席查询 或者甚至从表中取出将来可能发生变化的所有列 The sql Rows类型
  • 图像未显示在托管网站中

    感谢您花时间查看此内容 我已尽我所能进行研究 但没有提出任何建议 我看到一个类似的堆栈溢出帖子 关于等待图像完成处理 但我已经等了大约 2 5 小时 图像仍然丢失 我正在将 AngularFire 与 Firebase 一起使用 我正在使用
  • 使用“base”是否是一种不好的做法,即使它可能有利于可读性?

    我知道这是一个主观问题 但我总是对编码风格的最佳实践感到好奇 ReSharper 4 5 在实现类中调用基本方法之前向我发出有关关键字 base 的警告 即 base DoCommonBaseBehaviorThing 虽然我欣赏 越少越好
  • 将多个 -std 开关传递给 g++

    假设运行是否安全g with g std c 98 std c 11 会使用C 11编译吗 我在中没有找到明确的确认文档 但我看到 O标志的行为是这样的 The 海湾合作委员会手册没有说明 任何互斥的最后一个 std 指定的选项生效 第一次
  • GMail 未显示我使用 System.Net.Mail 发送的内联图像 (cid)

    当我通过 Outlook 或 gmail 向 gmail 电子邮件地址发送电子邮件时 我可以添加直接显示在 gmail 网络界面中的内联图像 工作电子邮件的相关原始邮件标头和原始正文部分 089e0158b6909948880520cef5
  • 如何在 Python 中打开文本文件?

    目前 我正在尝试打开一个名为 Temperature txt 的文本文件 我已使用文件处理程序保存在桌面上 但是由于某种原因我无法使其工作 谁能告诉我我做错了什么 Python34 python from math import fh op
  • 如何集群ServiceMix?

    我正在寻找一些有关如何集群 ServiceMix 解决方案的初步指导 基本上我需要的是 有 2 个 或更多 ServiceMix 实例满足我的路由需求并共享负载 如果一个实例失败 其他实例继续服务 如果失败的人复活了 它就会加入队伍 搜索信
  • std::some-namespace::transform 有一天可以支持任何函子吗?

    std transform来自