如何将一个 comonad 和一个 monad 组合成一个 comonad?

How to combine a comonad and a monad into a comonad?

假设我有

如何定义comonad D T

你不能。假设 D 是 identity comonad,TCont Void,即空类型的延续 monad。

newtype D a = D {runD :: a}
newtype T a = T {runT :: (a -> Void) -> Void}

那么分配率是微不足道的。但是 extract :: D (T a) -> a 不能定义为一个完整的可计算程序。这将是双重否定消除forall a. ((a -> Void) -> Void) -> a,这在构造性语言中是不可定义的。