普通指针连同通常的操作 & 和 * 是一个 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 即使二元加法运算符未表示 +
,只要它可从上下文中获得。
类型构造函数:
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 即使二元加法运算符未表示 +
,只要它可从上下文中获得。