理解 Purescript 中的 Safe.Coerce

Understanding Safe.Coerce in Purescript

我一直在查看一些代码片段的编译版本,以深入了解我的代码在运行时的表示方式。

看到编译后的安全强制和不安全强制相同,我并不感到惊讶 JavaScript。到目前为止,在我看过的代码中有一个字典传递给了安全强制 unused/undefined。

似乎如果两种类型的运行时表示相同,那么 having/using 这样的类型不应该有任何运行时开销。这不是真的,我很想知道为什么。

强制转换两种类型需要在运行时调用函数。我不明白的是这个函数调用似乎什么也没做。

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);

在这种情况下,Selectioncoerce 都只会 return 他们得到的东西。完成类型检查后,我不确定它们继续服务的目的是什么。

之所以按原样生成代码,而不是像您建议的那样以更高效的形式生成代码,是因为 purs 编译器只有一个简单的优化器。

为什么 unsafeCoerce 被这样定义是因为它是一个 PureScript 函数并且必须匹配 PureScript 函数的运行时表示。 Selection.

也是如此

约束在字典中表示为函数。前段时间添加了一个优化,这样空字典不必构造为空 JavaScript 对象,而是可以用 undefined 表示。这就是为什么没有参数传递给 coerce.