gpt4 book ai didi

c++ - 这个创建元组的习语有名字吗?

转载 作者:IT老高 更新时间:2023-10-28 13:21:03 25 4
gpt4 key购买 nike

Boost mailinglist ,@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
}

Live Example .

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

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

最佳答案

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

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

Monad 有两个主要支柱:

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

The Wikipedia有很好的关于 monad 的例子和解释。

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

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

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

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

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

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

length 只是 monad bind 运算符的非泛型版本,该运算符从前一个管道步骤中获取单子(monad)值,并绕过它到指定的函数(真正起作用的函数)。该函数就是这个计算步骤完成的功能。

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

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

那么,这个元组创建习语叫什么名字?好吧,我想这可以称为“monad-like tuples”,因为它不完全是一个 monad,但元组表示和扩展以类似的方式工作,保留到 Haskell 延续 monad。

编辑:更有趣

只是为了有趣的 C++ 编程,我一直在探索这个类似 monad 的东西。你可以找到一些例子 here .

关于c++ - 这个创建元组的习语有名字吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25338795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com