有一种方法可以在一个函数中使用多个monad吗?

MyB*_*Bug 2 monads haskell

我有一个功能

add2Maybe :: (Num a) => Maybe a -> Maybe a -> Maybe a
add2Maybe x y = do
    n1 <- x
    n2 <- y
    return $ n1 + n2
Run Code Online (Sandbox Code Playgroud)

Just 8使用Just 3和调用时,它将成功返回Just 5。我想要的是调用此功能时,类似于C语言中的printf调试,打印

The number in x is 3. --(Or Nothing).
The number in y is 5.
Final result is 8.
Run Code Online (Sandbox Code Playgroud)

然后返回Just 8

我得出的结论是,要定义这样的函数,我必须将Maybe monad与IO monad一起使用,但是的类型签名>>=不允许在一个函数中使用两个以上的monad。有没有办法将Maybe monad和IO monad结合起来,更一般地说,有没有办法结合两种或更多monad类型?

ama*_*loy 6

您正在寻找“单核变压器”。正如type IO aMaybe avalue是monad一样,type的值也可以IO (Maybe a)。此组合使用MaybeT

但是,这是一个高级话题,如果您是概念的新手,那么您会抓狂的。如果只想执行printf样式的调试,请考虑Debug.Trace使用。它使您可以在调试时欺骗类型系统以获取文本输出,但决不能在完成的程序中使用。