值多态和"生成异常"

rua*_*akh 5 exception sml language-lawyer value-restriction

根据标准ML的定义(修订):

这个想法是对非扩展表达式的动态评估既不会生成异常也不会扩展内存的域,而对扩展表达式的评估可能会.

[§4.7,p19; 强调我的]

我在网上找到了很多关于ref-cell部分的信息,但几乎没有关于异常部分的信息.(一些消息来源指出,仍然可能会出现多态绑定Bind,并且这种不一致可能会产生类型理论和/或实现后果,但我不确定这是否相关.)

我已经能够想出一个与异常相关的不健全的东西,如果我没有弄错的话,只能通过价值限制来阻止; 但这种不健全并不取决于提出异常:

local
  val (wrapAnyValueInExn, unwrapExnToAnyType) =
    let exception EXN of 'a
    in  (EXN, fn EXN value => value)
    end
in
  val castAnyValueToAnyType = fn value => unwrapExnToAnyType (wrapAnyValueInExn value)
end
Run Code Online (Sandbox Code Playgroud)

那么,任何人都可以告诉我定义的内容,以及它为什么提到例外?

("生成异常"是否可能意味着生成异常名称,而不是生成异常数据包?)

rua*_*akh 2

[向Eduardo Le\xc3\xb3n \ 的回答致敬,他指出定义确实指的是这一点,并引入了短语“生成异常”。我对他的答案投了赞成票,但我将其单独发布,因为我觉得他的答案是从错误的方向来回答这个问题的,有些:大部分答案都是对问题已经预设的事物的阐述。]

\n\n
\n\n
\n

是否有可能“生成异常”意味着生成异常名称,而不是生成异常数据包

\n
\n\n

是的,我想是这样。尽管定义通常不单独使用“异常”一词,但其他来源通常将异常名称简单地称为“异常”——包括在生成异常的特定上下文中。例如,来自http://mlton.org/GenerativeException

\n\n
\n

在标准机器学习中,异常声明被认为是生成性的,因为每次评估异常声明时,它都会产生一个新的异常。

\n
\n\n

(正如您所看到的,该页面始终将异常名称称为“异常”。)

\n\n

同样,标准机器学习基础库也以这种方式使用“异常”。例如,从第 29 页开始:

\n\n
\n

在一种极端情况下,程序员可以General.Fail在任何地方使用标准异常,让它携带一个描述特定故障的字符串。[...] 例如,一种技术是让sampleFn结构中的函数Sample引发异常Fail "Sample.sampleFn"

\n
\n\n

正如您所看到的,本段使用了术语“异常”两次,一次引用异常名称,一次引用异常值,依靠上下文使含义变得清晰。

\n\n

因此,定义使用短语“生成异常”来指代生成异常名称是相当合理的(尽管如此,这可能是一个小错误;定义通常这更精确和正式,并且通常表示何时打算依赖上下文来消除歧义)。

\n