我有一个功能
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类型?
您正在寻找“单核变压器”。正如type IO a和Maybe avalue是monad一样,type的值也可以IO (Maybe a)。此组合使用MaybeT。
但是,这是一个高级话题,如果您是概念的新手,那么您会抓狂的。如果只想执行printf样式的调试,请考虑Debug.Trace使用。它使您可以在调试时欺骗类型系统以获取文本输出,但决不能在完成的程序中使用。
| 归档时间: |
|
| 查看次数: |
89 次 |
| 最近记录: |