【问题标题】:Why does this function seem to hide its embedded exception?为什么这个函数似乎隐藏了它的嵌入异常?
【发布时间】:2018-07-13 21:18:41
【问题描述】:

在评论another question 时,我发现引用透明度明显中断。在 ghci 中:

> f g h = g `seq` h `seq` \x -> g (h x)
> seq (f undefined id) ()
()
> seq (undefined `seq` id `seq` \x -> undefined (id x)) ()
*** Exception: Prelude.undefined
CallStack (from HasCallStack):
  error, called at libraries/base/GHC/Err.hs:79:14 in base:GHC.Err
  undefined, called at <interactive>:3:14 in interactive:Ghci9

为什么第一个不是底部? (GHC 8.2.2 以防万一——我目前没有在这台机器上安装任何其他版本。)

【问题讨论】:

  • GHC 8.2.1 产生相同的行为
  • 在我看来 f 中的 lambda 正在浮动。奇怪,但也许在某种程度上是有效的。或者,在某些版本的 ghc 中浮动 lambda 时,可能不尊重 seq
  • 我可以在 8.0 和 8.4 上重现这种令人惊讶的行为。它看起来肯定是错误的。编译后的程序会抛出异常。
  • 这似乎不会发生在已编译的程序中,只会发生在 ghci 中。
  • 简体:f g = g `seq` \x -&gt; x.

标签: haskell exception


【解决方案1】:

看起来这是Trac #14002。如果你这样做:

> :set -fpedantic-bottoms

或者在一个文件中定义f并将其加载到GHCi中,那么两个表达式都会引发异常。

错误报告声称很难在不影响性能的情况下修复它。

【讨论】:

  • 太棒了,这个错误甚至使用了与我的示例相同的功能。 =D
猜你喜欢
  • 2012-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
相关资源
最近更新 更多