类型构造函数:
template< typename T > T*;
单位操作员
template< typename T > T* unit( T /*or T&*/ t ) { return &t; }
绑定操作符
template< typename A, typename B >
B* bind( A a, std::function<b*(a)> f )
{ return a ? f(a) : nullptr; }
Monad法律
bind( unit(x), f ) === f(x)
bind( bind(x, f1), f2 ) === auto a = f1(x); auto b = f2(a); return b;
答案 0 :(得分:2)
指向T的指针是T引用上的monad而不是T;一个可选的T是一个超过T的monad。
如果缺少函数式语言,这种区别很重要。引用具有生命周期,指针遵循这些生命周期。
我同意缺乏与传统名称相匹配的功能是一个不重要的细节;即使二进制加法运算符未表示为+
,向量空间仍然是向量空间,只要它可以从上下文中获得。