理解 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);
在这种情况下,Selection
和 coerce
都只会 return 他们得到的东西。完成类型检查后,我不确定它们继续服务的目的是什么。
之所以按原样生成代码,而不是像您建议的那样以更高效的形式生成代码,是因为 purs 编译器只有一个简单的优化器。
为什么 unsafeCoerce 被这样定义是因为它是一个 PureScript 函数并且必须匹配 PureScript 函数的运行时表示。 Selection
.
也是如此
约束在字典中表示为函数。前段时间添加了一个优化,这样空字典不必构造为空 JavaScript 对象,而是可以用 undefined
表示。这就是为什么没有参数传递给 coerce
.
我一直在查看一些代码片段的编译版本,以深入了解我的代码在运行时的表示方式。
看到编译后的安全强制和不安全强制相同,我并不感到惊讶 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);
在这种情况下,Selection
和 coerce
都只会 return 他们得到的东西。完成类型检查后,我不确定它们继续服务的目的是什么。
之所以按原样生成代码,而不是像您建议的那样以更高效的形式生成代码,是因为 purs 编译器只有一个简单的优化器。
为什么 unsafeCoerce 被这样定义是因为它是一个 PureScript 函数并且必须匹配 PureScript 函数的运行时表示。 Selection
.
约束在字典中表示为函数。前段时间添加了一个优化,这样空字典不必构造为空 JavaScript 对象,而是可以用 undefined
表示。这就是为什么没有参数传递给 coerce
.