如果我有一个函数,例如,在monad T中,f1 :: T String
,并且我想使用它的结果,请打印它,例如。
seeF1 :: IO String
seeF1 = do
res <- f1
print res
为什么会出错?似乎我不能使用f1,因为它不在monad IO中。那么,我该怎么办呢?提升?
答案 0 :(得分:2)
以do
表示法,当你这样做时
x = do
y <- z
....
然后,如果x :: (Monad m) => m a
,那么z :: (Monad m) => m b
m
是同一个monad。
毕竟这是非常合乎逻辑的:想象一下,如果您的T
monad是列表,那么seeF1
应该返回什么?或者,如果T
monad为Maybe
,seeF1
将无法打印任何内容,以防遇到Nothing
,因为结果未定义。
因此,一般来说,你所要求的是不可能的。但是,如果您对T
更具体一点,那么您可能会找到一种方法从IO a
获取T a
。例如,如果您查看transformers中定义的monad,很多人都会使用run
函数对其进行转换,并从中获取IO
。