问题标签 [automatic-generalization]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
278 浏览

optimization - F# 自动泛化和性能

我最近遇到了意外的代码优化,想检查一下我对所观察到的内容的解释是否正确。以下是该情况的一个非常简化的示例:

两个代码块之间的唯一区别是,在第二种情况下,我将 swap 的参数显式声明为整数。然而,当我使用#time 在 fsi 中运行 2 个片段时,我得到:

案例 1 真实:00:00:00.011,CPU:00:00:00.000,GC gen0:0,gen1:0,gen2:0
案例 2 真实:00:00:00.004,CPU:00:00:00.015,GC gen0 :0,第一代:0,第二代:0

即第二个片段的运行速度是第一个片段的 3 倍。这里的绝对性能差异显然不是问题,但是如果我大量使用交换功能,它就会堆积起来。

我的假设是性能下降的原因是,在第一种情况下,swap 是通用的并且“需要相等”,并检查 int 是否支持它,而第二种情况不需要检查任何东西。这是发生这种情况的原因,还是我错过了其他东西?更一般地说,我是否应该将自动泛化视为一把双刃剑,也就是说,一个很棒的功能可能会对性能产生意想不到的影响?

0 投票
3 回答
1695 浏览

generics - F# 中的泛型函数

我仍在努力思考 F# 如何泛化(或不泛化)函数和类型,并且有一个案例困扰着我:

这里 min 具有泛型类型'a * 'a -> 'a (requires comparison),而 add 具有具体类型int * int -> int,显然是从它在程序中的第一次使用中推断出来的。两者都以相同的方式声明和使用,那么为什么在概括上有所不同呢?

我知道在添加的情况下,可以通过声明内联函数来回避问题,这会导致它获得泛型类型定义,即'a * 'b -> 'c (requires member (+)),但这并不能解释为什么在这种情况下需要这样做而不是其他。

0 投票
1 回答
94 浏览

c++ - 概括应用程序的用户界面

我正在使用 C 语言工作并为嵌入式设备创建应用程序。这些应用程序主要包括捕获数据并将其存储到数据库中以执行注册。这涉及到许多小部件,如框架、按钮、复选框、单选按钮、小部件列表框、文本框、条目、组合框等。所有这些小部件都是使用 X 库创建的。

我尝试使用 CSV 文件使应用程序通用化,列出用户想要创建的所有小部件,然后根据 CSV 文件中提到的信息相应地创建这些小部件。

我正在创建的 CSV 文件包括以下内容

  1. 小部件名称
  2. 小部件类型
  3. 小部件数据输入类型/最大长度/最小长度............等

请提出其他一些方法,或者我该如何改进当前的方法本身?我还通过 CSV 本身提供的信息创建数据库。我可以说这是一种“数据驱动的用户界面”方法。我需要一些建议。请给我一些好的建议。

平台:Linux、GCC编译器

0 投票
2 回答
84 浏览

python - 如何参考 | 蟒蛇| 语法/逻辑

我编写了 python 代码来组织 40G 的音乐,但它只适用于我的计算机,所以我想概括代码,以便它可以在任何计算机的任何目录中工作。

我想将使用“~/Desktop/mp3-organizer/”的行更改为“root_folder/%s”% song_info.tag.artist,其中“root_folder”=当前工作目录

但我知道那行不通,我只是不知道如何“用词”它。

回顾一下,目标是让代码在放置脚本的目录中运行。不仅适用于我计算机中的特定目录。

感谢任何帮助

0 投票
1 回答
1199 浏览

dependencies - 用于自动生成依赖项的英特尔 Fortran 编译器选项

INTEL Fortran 编译器是否有自动生成依赖项的选项,例如 c/c++ 编译器的“-MM”选项,我们可以在 makefile 中使用?

0 投票
2 回答
155 浏览

optimization - F# 中的泛化函数

我需要一个在 F# 中产生素数的函数。我找到了这个:

这很好用,但有时我也需要使用 int64/BigInts。有没有比提供像这样的其他序列更聪明的方法来重用这段代码:

我听说过使用“inline”和“LanguagePrimitives”修改代码,但我发现的只是与函数有关,而我的问题与一个值有关。

此外 - 我想要一个可以处理整数类型并计算平方根下限的函数。

但我看不到返回与“arg”相同类型的方法,因为 Math.Sqrt 返回一个双精度值。再说一遍 - 有什么比我自己重新实现计算平方根的逻辑更好的方法吗?

0 投票
1 回答
112 浏览

f# - 如何在一个简单的函数中实现自动泛化

我创建了以下运算符来帮助安全划分。

问题是它只适用于整数,我希望这个函数适用于任何数字原语(int、float、decimal 等)。

我已经阅读了一些关于自动泛化的文章,但还没有完全深入,我不确定这是否是正确的方向。

我如何完成对这个运算符的泛化?

谢谢,

0 投票
1 回答
80 浏览

generics - 为什么自动泛化有时会推断出过于具体的类型?

当运算符的一侧具有已知类型而另一侧没有时,某些函数用法无法编译。一个例子是计量单位:

5. * 3.<myUnit>显然是一个有效的表达式,所以这令人惊讶,特别是考虑到inline函数在其他情况下最大程度地泛化:

但是,这不仅限于测量单位。比如说,我创建了一个支持非对称乘法和浮点数的类型。它与multiplyWithFive函数不兼容,它任意推断其参数为float

同样,5. * boxThree是一个有效的表达式。但自动泛化似乎并未承认这一点。

我可以使用可识别度量单位的类型注释来“修复”第一种情况,但这无缘无故地限制了基础类型。如果我真的需要一个更通用的功能,我不知道如何阻止编译器弥补限制。如果我明确命名一个泛型参数,它只是拒绝保持其泛型:

我能做些什么呢?有什么办法可以说我确实想要更通用的版本吗?

0 投票
2 回答
188 浏览

generics - 为什么 F# 编译器有时会错误地泛化函数?

我最近遇到了 F# 编译器的一些意外行为。我能够找到一种解决方法,但最初的行为让我感到困惑,我想看看是否有人可以帮助我了解导致它的原因。

我定义为非泛型的函数正在变为泛型,这干扰了函数在多个调用之间共享状态的能力。我将我的用例简化为以下内容:

为什么nextId类型为 'a -> int 而不是 obj -> int?显然,泛化也是导致它重复返回 1 的错误的原因,但是为什么泛化首先会发生呢?

请注意,如果我在没有命名嵌套函数的情况下定义它,它会在提供唯一 ID 时按预期工作:

但更神秘的是,有了这个定义,F# Interactive 无法判断 nextId 是 (obj -> int) 还是 ('a -> int)。当我第一次定义它时,我得到

val nextId : (obj -> int)

但如果我只是评估

我明白了

验证它:('a -> int)

这里发生了什么,为什么我的简单函数会自动泛化?