M a
转换为 ~~A
,这里的~
表示逻辑否定。return :: a -> M a -- Map to tautology A => ~~A, double negation introduction
(>>=) :: M a -> (a -> M b) -> M b -- Map to tautology ~~A => (A => ~~B) => ~~B
其他操作也是重言式:
fmap :: (a -> b) -> M a -> M b -- Map to (A => B) -> (~~A => ~~B)
join :: M (M a) -> M a -- Map to ~~(~~A) => ~~A
据理解,根据正常函数语言的Curry-Howard对应(Curry-Howard correspondence),它是直觉逻辑而不是古典逻辑,因此我们不能期望像~~A => A这样的重言式有一个对应关系。
但我在思考另一件事情。为什么Monad只能与双重否定有关?单重否定的对应是什么?这引导我想到了以下类定义:
class Nomad n where
rfmap :: (a -> b) -> n b -> n a
dneg :: a -> n (n a)
return :: Nomad n => a -> n (n a)
return = dneg
(>>=) :: Nomad n => n (n a) -> (a -> n (n b)) -> n (n b)
x >>= f = rfmap dneg $ rfmap (rfmap f) x
在这里,我定义了一个名为“Nomad”的概念,并支持两个操作(都与直觉逻辑中的逻辑公理相关)。请注意,“rfmap”名称表示其签名类似于函子的
fmap
,但结果中a
和b
的顺序被颠倒。现在我可以用它们重新定义Monad操作,将M a
替换为n (n a)
。现在让我们来到问题部分。Monad是范畴论中的一个概念,这似乎意味着我的“Nomad”也是一个范畴论概念。那么它是什么?它有用吗?这个主题是否存在任何论文或研究结果?
rfmap
是针对逆变函子的一种操作。 - shachaf