首页 > 解决方案 > 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 的一大优势。

然而,这样的优化实际上需要在某个地方实现。

标签: f#fable-f#

解决方案


我希望 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)

推荐阅读