普通指针连同通常的操作 & 和 * 是一个 monad 吗?

Is the plain pointer, together with the usual operations & and *, a monad?

类型构造函数:

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; }

单子定律

bind( unit(x), f ) === f(x)
bind( bind(x, f1), f2 ) === auto a = f1(x); auto b = f2(a); return b;

指向 T 的指针是 T 上的 monad 引用而不是 T 上的;可选的 T 是 T 上的单子。

这种区别很重要,即使在函数式语言中缺失。引用有生命周期,指针遵循这些生命周期。

我同意缺少与传统名称匹配的功能是一个不重要的细节;向量 space 仍然是向量 space 即使二元加法运算符未表示 +,只要它可从上下文中获得。