在IO monad中使用,来自其他monad的函数

时间:2016-08-10 19:51:02

标签: haskell monads

如果我有一个函数,例如,在monad T中,f1 :: T String,并且我想使用它的结果,请打印它,例如。

seeF1 :: IO String
seeF1 = do
  res <- f1
  print res

为什么会出错?似乎我不能使用f1,因为它不在monad IO中。那么,我该怎么办呢?提升?

1 个答案:

答案 0 :(得分:2)

do表示法,当你这样做时

x = do
  y <- z
  ....

然后,如果x :: (Monad m) => m a,那么z :: (Monad m) => m b m是同一个monad。

毕竟这是非常合乎逻辑的:想象一下,如果您的T monad是列表,那么seeF1应该返回什么?或者,如果T monad为MaybeseeF1将无法打印任何内容,以防遇到Nothing,因为结果未定义。

因此,一般来说,你所要求的是不可能的。但是,如果您对T更具体一点,那么您可能会找到一种方法从IO a获取T a。例如,如果您查看transformers中定义的monad,很多人都会使用run函数对其进行转换,并从中获取IO