以下是我们拥有的一个非常常见的模式的简化,其中您有一些重试组合器包装 IO 操作。我想要一些堆栈跟踪,所以我添加了HasCallStack约束,但结果堆栈跟踪并不令人满意:
import Control.Monad (forM_)
import GHC.Stack
httpCall :: HasCallStack => IO ()
httpCall = do
putStrLn $ prettyCallStack callStack
print "http resolved"
retry :: HasCallStack => IO () -> IO ()
retry op =
forM_ [1] $ \i ->
op
main :: IO ()
main = retry httpCall
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪:
CallStack (from HasCallStack):
httpCall, called at main.hs:16:14 in main:Main
"http resolved"
Run Code Online (Sandbox Code Playgroud)
我假设HasCallStack约束得到解析main以适应参数类型,retry所以我将约束添加到参数类型:
CallStack (from HasCallStack):
httpCall, called at main.hs:16:14 in main:Main …Run Code Online (Sandbox Code Playgroud)