考虑具体的例子IOT Maybe
。您将如何为此编写Monad
实例?你可以从这样的事情开始:
instance Monad (IOT Maybe) where
return x = IOT (Just (return x))
IOT Nothing >>= _ = IOT Nothing
IOT (Just m) >>= k = IOT $ error "what now?"
where m' = liftM (runIOT . k) m
现在你有了m' :: IO (Maybe (IO b))
,但你需要一些类型Maybe (IO b)
,其中——最重要的是——和之间的选择Just
应该Nothing
由m'
. 那将如何实施?
当然,答案是它不会,因为它不能。你也不能证明unsafePerformIO
隐藏在纯接口后面的 in 是合理的,因为从根本上说,你要求一个纯值——Maybe
构造函数的选择——依赖于IO
. Nnnnnope,不会发生。
在一般情况下情况甚至更糟,因为任意(普遍量化的)Monad
比实际更不可能解开IO
。
顺便说一句,ST
您提到的变压器的实现方式与您建议的不同IOT
。ST
它使用as a State
-like monad的内部实现,使用编译器提供的魔法精灵粉StateT
特殊原语,并在此基础上定义 -like 转换器。IO
在内部实现为更神奇ST
的 ,因此IOT
可以以类似的方式定义假设。
并不是说这真的会改变任何事情,除了可能让您更好地控制由IOT
.