f# - Fable 中是否有任何优化通道可用?
问题描述
我在Fable REPL中编写了以下代码:
open Fable.Core
let inline sqr x = x * x
// Filters out `points` that are more than `radius` away
let inRadius radius points =
points
|> List.filter (fun (x, y) -> sqr x + sqr y <= sqr radius)
输出的 JavaScript 是:
import { filter } from "fable-library/List.js";
export function inRadius(radius, xs) {
return filter(function predicate(tupledArg) {
return tupledArg[0] * tupledArg[0] + tupledArg[1] * tupledArg[1] <= radius * radius;
}, xs);
}
更优化的 JavaScript 将是:
import { filter } from "fable-library/List.js";
export function inRadius(radius, xs) {
const radiusSquared = radius * radius;
return filter(function predicate(tupledArg) {
return tupledArg[0] * tupledArg[0] + tupledArg[1] * tupledArg[1] <= radiusSquared;
}, xs);
}
(这只是可能应用的优化的一个示例,还有更多可能性)
在 JavaScript 中,由于缺少类型,很难安全地进行这种优化。但是,在原始 F# 代码中,我们知道 的类型,radius
因此我们可以安全地进行此优化。对我来说,这似乎是 Fable 优于 JavaScript 的一大优势。
然而,这样的优化实际上需要在某个地方实现。
- 是否可以在 Fable 中启用这样的优化?
- 如果没有,是否有其他工具可以执行此类优化?
解决方案
我希望 Fable 或任何其他转译器能够保留代码的结构。因此,您可以优化 F# 代码以仅计算一次 radius^2。
open Fable.Core
let inline sqr x = x * x
// Filters out `points` that are more than `radius` away
let inRadius radius =
let radiusSqr = sqr radius
List.filter (fun (x, y) -> sqr x + sqr y <= radiusSqr)
推荐阅读
- ruby - 如何在ruby中用重音字符分割字符串
- python - For 循环未正确附加值
- firebase - 来自本地网络的 Firebase 模拟器
- c# - 如果删除所有行,如何显示 GridView 的页眉和页脚
- heroku - Travis 没有部署在 heroku 上。无效证件
- angular - 对“hammerjs”的依赖。CommonJS 或 AMD 依赖项可能导致优化救助
- python - Django 使用当前用户的模型创建表单字段
- python - Python - 无法将元组解析为 DataFrame
- android - Kotlin Android 从另一个活动添加到列表
- core-data - SwiftUI 绑定到 foreach 中的核心数据对象