假设我有
- 一个科莫纳德
D
- 一个单子
T
l : D T -> T D
的分配法则D
于单子T
。
如何定义D T
你不能。假设D
是恒等式 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
,这在建构语言中是无法定义的。