- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
GHC 8 提供 HasCallStack
来自 GHC.Stack
模块,它允许函数在调用时请求记录堆栈帧。它还提供withFrozenCallStack
函数,它“卡住”调用堆栈,因此不能再向其中添加帧。
在简单的情况下,这可以按我的预期工作。例如:
ghci> let foo :: HasCallStack => CallStack
foo = callStack
ghci> foo
[("foo",SrcLoc {srcLocPackage = "interactive", srcLocModule = "Ghci2", srcLocFile = "<interactive>", srcLocStartLine = 8, srcLocStartCol = 1, srcLocEndLine = 8, srcLocEndCol = 4})]
ghci> withFrozenCallStack foo
[]
foo
通常,我得到一个堆栈帧,但是当我用
withFrozenCallStack
包装它时, 我不。完美的。然而,当这个例子稍微复杂一点时,它就不再像我预期的那样表现了:
ghci> let foo :: CallStack
foo = bar
bar :: HasCallStack => CallStack
bar = callStack
ghci> foo
[("bar",SrcLoc {srcLocPackage = "interactive", srcLocModule = "Ghci9", srcLocFile = "<interactive>", srcLocStartLine = 24, srcLocStartCol = 11, srcLocEndLine = 24, srcLocEndCol = 14})]
ghci> withFrozenCallStack foo
[("bar",SrcLoc {srcLocPackage = "interactive", srcLocModule = "Ghci9", srcLocFile = "<interactive>", srcLocStartLine = 24, srcLocStartCol = 11, srcLocEndLine = 24, srcLocEndCol = 14})]
withFrozenCallStack
,堆栈帧仍然被包含在内。 .为什么?
HasCallStack
的理解是不是就像隐式使用
pushCallStack
在当前调用堆栈上,和
pushCallStack
对卡住的调用堆栈没有影响。那么,为什么
withFrozenCallStack
不阻止上面的堆栈帧被添加到调用堆栈?
最佳答案
在您的代码中,foo
是 CallStack
类型的静态值.请注意,它没有 HasCallStack
约束。
使用方式和地点无关紧要foo
,它将始终引用这个特定的 CallStack
.没关系foo
本身是使用 bar
定义的它使用 HasCallStack
机器——你可以静态定义foo = [("bar",…
.
尝试添加 HasCallStack =>
至foo
的类型签名。它现在的行为是否符合您的预期?
关于haskell - 为什么在使用 withFrozenCallStack 时 HasCallStack 仍会添加堆栈帧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40855484/
以下是我们拥有的一个非常常见的模式的简化,其中您有一些重试组合器包装 IO 操作。我想要一些堆栈跟踪,所以我添加了 HasCallStack约束,但由此产生的堆栈跟踪并不真正令人满意: import
到达错误分支时生成调用堆栈具有运行时成本;这很容易理解。 但是 HasCallStack约束也会影响正常分支的性能吗?如何? 最佳答案 添加HasCallStack的效果对函数的约束foo或多或少等同
GHC 8 提供 HasCallStack来自 GHC.Stack模块,它允许函数在调用时请求记录堆栈帧。它还提供withFrozenCallStack函数,它“卡住”调用堆栈,因此不能再向其中添加帧
假设我有这个类型类: import GHC.Stack class Foo a where foo :: a instance Foo Int where foo = undefined 如何
AFAIK,有两种方法可以在 Haskell 中获取用于调试的调用堆栈: 添加 HasCallStack代码中的约束 使用 ghc -prof -fprof-auto-top 编译代码 我的测试代码:
我是一名优秀的程序员,十分优秀!