我认为这是类似 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...); };
};
我想在这里我们确定return
Monad 的函数:获取值并以 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.