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

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

本文关键字:monad 指针 操作      更新时间:2023-10-16

类型构造函数:

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 上的 monad;可选的 T 是 T 上的 monad。

如果函数式语言中缺少这种区别,那么这种区别就很重要。 引用具有生存期,指针遵循这些生存期。

我同意缺乏与传统名称匹配的函数是一个不重要的细节;向量空间仍然是向量空间,即使二进制加法运算符没有表示+,只要它可以从上下文中获得。