我一直在查看一些代码片段的编译版本,以深入了解我的代码是如何在运行时表示的。
在编译的JavaScript中,看到安全胁迫和不安全胁迫是相同的,我并不感到惊讶。到目前为止,在我看过的代码中,有一个未使用/未定义的字典被传递给了安全强制。
看起来,如果两种类型的运行时表示是相同的,那么拥有/使用这种类型就不需要任何运行时开销。这不是真的,我很好奇为什么。
胁迫两种类型需要在运行时调用函数。我不明白的是,这个函数调用似乎什么也不做。
exports.unsafeCoerce = function (x) {
  return x;
};如果我声明一个新类型
newtype Selection = Selection Int我在JavaScript中看到了类似的东西:
var Selection = function (x) {
  return x;
};这意味着我可能在JavaScript中看到这样的东西:
return Selection(Data_Int.pow(2)(Safe_Coerce.coerce()(n) - 1 | 0));它应该与此相同:
return Data_Int.pow(2)(n - 1 | 0);在这种情况下,Selection和coerce都只返回给定的内容。一旦完成了类型检查,我就不知道它们继续起什么作用了。
发布于 2021-03-23 22:47:32
代码生成的原因就像您建议的那样,而不是以更高效的形式生成,因为purs编译器只有一个简单的优化器。
之所以定义unsafeCoerce,是因为它是一个PureScript函数,必须与PureScript函数的运行时表示相匹配。Selection也是如此。
约束被表示为字典上的函数。不久前,还添加了一种优化,使空字典不必构造为空JavaScript对象,而是可以由undefined表示。这就是为什么没有将参数传递给coerce的原因。
https://stackoverflow.com/questions/66770207
复制相似问题