这个元组创建习惯有名字吗?

2024-05-10

On the 增加邮件列表 http://lists.boost.org/Archives/boost/2014/06/214213.php,@LouisDionne 最近发布了以下创建类似元组的实体的巧妙技巧:

#include <iostream>

auto list = [](auto ...xs) { 
    return [=](auto access) { return access(xs...); }; 
}; 

auto length = [](auto xs) { 
    return xs([](auto ...z) { return sizeof...(z); }); 
};

int main()
{
    std::cout << length(list(1, '2', "3")); // 3    
}

实例 http://coliru.stacked-crooked.com/a/11edc69bc10817e5.

巧妙之处就在于list是一个 lambda,将可变参数列表作为输入,并返回一个 lambda 作为输出,该输出将接受另一个 lambda 对其输入进行操作。相似地,length是一个采用类似列表的实体的 lambda,它将为其提供可变参数sizeof...运算符添加到列表的原始输入参数。这sizeof...运算符被包装在 lambda 中,以便可以将其传递给list.

Question:这个元组创建习惯有名字吗?也许来自更常用高阶函数的函数式编程语言。


我认为这是类似 Monad 的微妙实现,特别是与延续 monad 具有相同精神的东西。

Monad 是一种函数式编程结构,用于模拟计算不同步骤之间的状态(请记住函数式语言是无状态的)。
monad 的作用是将不同的函数链接起来,创建一个“计算管道”其中每个步骤都知道计算的当前状态。

Monad 有两个主要支柱:

  • 返回函数,它接受一个值并以 Monad 就绪形式返回它。
  • 一个绑定函数,它接受一个 Monad 就绪值(来自上一个管道步骤)并将其解包到其原始 from 以将该值传递到下一步。

维基百科 http://en.m.wikipedia.org/wiki/Monad_(functional_programming)有关于 monad 的很好的例子和解释。

让我重写给定的 C++14 代码:

auto list = []( auto... xs ) 
{ 
    return [=]( auto access ) { return access(xs...); };
};

我想在这里我们确定returnMonad 的函数:获取值并以 Monadic 方式返回它。 具体来说,此返回返回一个从“元组”类别到可变参数包类别的函子(在数学意义上,不是 C++ 函子)。

auto pack_size = [](auto... xs ) { return sizeof...(xs); };

pack_size只是一个普通的函数。它将在管道中用于完成一些工作。

auto bind = []( auto xs , auto op ) 
{
    return xs(op);
};

And length只是接近 monad 的非通用版本bind运算符,一个运算符,它从先前的管道步骤中获取一元值,并将其绕过到指定的函数(真正完成工作的函数)。该函数是该计算步骤完成的功能。

最后你的调用可以重写为:

auto result = bind(list(1,'2',"3"), pack_size);

So, 这个元组创建习语的名称是什么?嗯,我想这可以称为“类似单子的元组”,因为它不完全是一个 monad,但元组表示和扩展以类似的方式工作,仍然是 Haskell 延续 monad。

编辑:更有趣

只是为了感受有趣的 C++ 编程,我一直在探索这个类似 monad 的东西。你可以找到一些例子here https://gist.github.com/Manu343726/fb57746274fffc043c2a.

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

这个元组创建习惯有名字吗? 的相关文章

随机推荐

  • 为什么 std::atomic 比 volatile bool 慢很多?

    多年来我一直使用 volatile bool 来控制线程执行 并且效果很好 in my class declaration volatile bool stop In the thread function while stop do th
  • Android 在通话期间播放音频文件[重复]

    这个问题在这里已经有答案了 对于我的 Android 应用程序 我想在从应用程序接听电话后播放音频文件 应用程序将发起电话呼叫 一旦接收者接听电话 应用程序应开始播放录制的音频文件 通过在谷歌上进行大量搜索 我发现这对于未root的设备来说
  • 如何使用 cf 程序查看我的 VCAP_SERVICES 环境变量?

    当我跑步时cf env
  • Zsh 中的鱼式自我暗示?

    有没有办法做到鱼的自我暗示类型 http ridiculousfish com shell images autosuggestion png in Zsh https github com tarruda zsh autosuggesti
  • 春季启动大战

    我倾向于在开发过程中使用可运行的 JAR 但我需要 WAR 来进行部署 我已经关注了this http spring io guides gs convert jar to war 有关从 JAR 转换为 WAR Spring Boot G
  • 如何使用 Javascript 从 Chrome iOS 下载 blob 文件?

    如何使用 Javascript 从 Chrome iOS 下载 blob 文件 我正在从 iOS 下载文件 pdf excel txt png iOS 没有文件系统 这对下载来说是一个问题 我创建了一个代码 根据操作系统和导航器 如果需要
  • 检测 perl 中声明的包变量

    Given package main our f sub f sub g 1 我怎样才能确定 f 但不是 g 已宣布 即兴的 我以为 main g SCALAR 可能是未定义的 但它是一个善意标量参考值 背景 我想将一个变量导入到main
  • Android 中的字符串加密

    我正在使用代码进行加密和加密 它没有给出字符串结果 字节数组未转换为字符串 我几乎尝试了所有方法将字节数组转换为字符 但没有给出结果 public class EncryptionTest extends Activity EditText
  • C++ 更改屏幕方向问题 -- DEVMODE dmDisplayOrientation DMDO_90 undefined

    我似乎无法编译一些 C 代码 我正在翻转显示器的方向 但 VS2008 告诉我 DMDO 90 和 DMDO 270 无法识别 error C2065 DMDO 90 undeclared identifier error C2065 DM
  • 在子管理中显示父字段(list_display)

    这是 models py 的片段 class Applicant models Model name models CharField email models CharField class Application models Mode
  • JSX 中的混合运算符

    我想在 JSX 中使用混合运算符 例如 datas datas map function data i return
  • Apollo 客户端“未找到命名导出‘删除’”

    我正在尝试创建一个apollo client插件Nuxt 3应用 它当前抛出有关名为的包的错误ts invariant file Users my name Repositories project node modules apollo
  • 在新的 ASP.NET MVC 5 项目中更新 NuGet 包引用后,如何修复与 JSON.NET 的程序集版本冲突?

    我在 VS 2013 更新 1 中创建了一个新的 ASP NET MVC 5 Web 项目 然后更新了所有 NuGet 包 当我构建项目时 我收到以下警告 警告 MSB3243 无法解决 Newtonsoft Json Version 6
  • 如何使用 cypress 断言输入值是真实的

    我有一些意见
  • 为什么-标签没有关闭

    这是一个普遍问题 我的教授都无法回答 为什么我不必关闭 HTML 中的标签 所有其他标签都必须关闭 例如 or 那么为什么不呢 首先 它根本不是一个标签 在名义上基于 SGML 或 XML 的 HTML 版本中 它是文件类型声明 它具有在
  • 正则表达式文字-文本范围

    有什么方法可以向正则表达式指示要显式搜索的文本块吗 我问这个问题是因为我必须匹配一段非常非常长的文本 其中包含各种元字符 并且 并且必须完全匹配 然后是一些灵活的内容 足以值得使用正则表达式 然后是更多文本必须完全匹配 冲洗 重复 不用说
  • HTML5 画布将颜色应用于形状重叠的图像

    我将此图像绘制到 HTML5 画布上 我想做的就是只给它的一部分应用颜色 我想要应用颜色的部分由以下覆盖图像定义 所以 基本上 我想通过叠加来指导我的着色 因此 在覆盖像素与主图像像素相遇的地方 我应该在主图像上应用颜色 至少我认为它是这样
  • 如何在 Azure DevOps 中的运行未完成时更改其状态

    当我通过测试计划 gt 测试套件 gt 选择要执行的测试 gt 执行 gt 运行 Web 应用程序启动手动测试执行时 测试和反馈 浏览器扩展将启动 当由于任何原因我没有完成时测试执行并关闭 测试和反馈 窗口 系统将创建一个新的测试运行 可以
  • 尝试使用 SQL 身份验证登录失败

    我正在尝试使用 sa 用户名及其密码连接到 SQL Server 2008 在 SQL Server 日志文件中我看到以下错误 用户 sa 登录失败 原因 尝试使用 SQL 登录 认证失败 服务器配置为 Windows 身份验证 仅有的 当
  • 这个元组创建习惯有名字吗?

    On the 增加邮件列表 http lists boost org Archives boost 2014 06 214213 php LouisDionne 最近发布了以下创建类似元组的实体的巧妙技巧 include