如何将一个 comonad 和一个 monad 组合成一个 comonad?
How to combine a comonad and a monad into a comonad?
假设我有
- 一个社区
D
- 一个单子
T
- 单子
D
对单子 T
的分配律 l : D T -> T D
。
如何定义comonad D T
?
你不能。假设 D
是 identity comonad,T
是 Cont 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
,这在构造性语言中是不可定义的。
假设我有
- 一个社区
D
- 一个单子
T
- 单子
D
对单子T
的分配律l : D T -> T D
。
如何定义comonad D T
?
你不能。假设 D
是 identity comonad,T
是 Cont 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
,这在构造性语言中是不可定义的。