Haskell 有没有办法在一个函数中使用多个单子?

Haskell 有没有办法在一个函数中使用多个单子?,haskell,monads,Haskell,Monads,我有一个函数 add2Maybe::(Num a)=>可能a->可能a->可能a->可能a add2Maybe x y=do n1=不允许在一个函数中使用两个以上的monad。是否有一种方法可以组合monad和IO monad,更一般地说,是否有一种方法可以组合两种或两种以上的monad类型?您正在寻找一种“monad转换器”。正如类型为IO a和可能为a的值是单子一样,类型为IO(可能为a)的值也可以是单子。这种组合使用 然而,这是一个有点高级的话题,如果你对这些概念还不熟悉的话,会让你摸不着

我有一个函数

add2Maybe::(Num a)=>可能a->可能a->可能a->可能a
add2Maybe x y=do
n1=
不允许在一个函数中使用两个以上的monad。是否有一种方法可以组合monad和IO monad,更一般地说,是否有一种方法可以组合两种或两种以上的monad类型?

您正在寻找一种“monad转换器”。正如类型为
IO a
可能为a
的值是单子一样,类型为
IO(可能为a)
的值也可以是单子。这种组合使用


然而,这是一个有点高级的话题,如果你对这些概念还不熟悉的话,会让你摸不着头脑。如果您只想进行Prtff样式调试,请考虑。它允许您在调试时欺骗类型系统以获得文本输出,但不应在已完成的程序中使用。

如果您只需要
add2Maybe
实现,它就在这里

add2Maybe :: (Show a, Num a) => Maybe a -> Maybe a -> IO (Maybe a)
add2Maybe x y = do
                 mapM print x
                 mapM print y
                 return $ do 
                  n1 <- x
                  n2 <- y
                  return $ n1 + n2
add2Maybe::(Show a,Num a)=>maybea->maybea->IO(maybea a)
add2Maybe x y=do
mapM打印x
mapM打印y
返回$do
n1
add2Maybe :: (Show a, Num a) => Maybe a -> Maybe a -> IO (Maybe a)
add2Maybe x y = do
                 mapM print x
                 mapM print y
                 return $ do 
                  n1 <- x
                  n2 <- y
                  return $ n1 + n2