好吧,我正在研究 Haskell Monads。当我阅读维基百科分类理论文章时,我发现单子态射的签名看起来很像逻辑中的重言式,但你需要转换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对应是直觉逻辑,而不是经典逻辑,所以不能指望像重言式一样~~A => A
可以有对应。
但我在想别的东西。为什么单子只能与双重否定有关?单一否定的对应关系是什么?这使我得到以下类定义:
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”这个名称意味着它的签名类似于 functor 的fmap
,但结果中a
和的顺序b
相反。现在我可以用它们重新定义 Monad 操作,用 replace M a
to n (n a)
。
那么现在让我们进入问题部分。Monad是范畴论的一个概念,这似乎意味着我的“Nomad”也是一个范畴论的概念。那是什么?有用吗?该课题是否有论文或研究成果?