问题标签 [monomorphism]

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 投票
1 回答
82 浏览

haskell - 将单态函数与多态 Haxl 库一起使用?

我正在使用 Haxl 库,并且正在尝试同时实现fetchHTML

我面临的问题是 HaxlBlockedFetch是多态的:

然而我希望fetchHTML是单态的(只返回一个 Int):

因此,当我尝试编译时出现以下错误:

最初我认为我可以重新定义BlockedFetch为:

但是,这需要一个新的实现DataSource,以使其能够接收我的自定义BlockFetch'

显然,这只会向后影响,需要我重新编写整个 Haxl 模块!

我的问题是:

1)有没有一种简单的方法来制作fetchHTML多态?(我不太关心它返回什么,只是它完成后返回一些东西

2) Haskell 程序员遇到此类问题时的一般方法是什么?

0 投票
2 回答
241 浏览

javascript - 以单态方式从任意 JavaScript 对象中检索一些元信息(v8)?

v8 专家的问题。

最近,我在 v8 中发现了多态的情况。正是多态性仅对 4 个对象“形状”进行了很好的优化,之后性能显着下降。类和对象继承被忽略。这是一个非常令人沮丧的发现,因为在这些限制下,结构良好的代码将无法执行。自 2017 年以来,这似乎是一个众所周知的问题,而且在不久的将来不太可能发生任何变化。

所以,我愿意在用户空间实现更好的多态性:https ://github.com/canonic-epicure/monopoly

这不是一个新问题,它已经用几乎任何其他语言解决了,包括 vtables、代码专业化等。非常欢迎任何关于如何在 JavaScript 中完成的建议。

我目前试图解决的问题是从任意对象单态检索一些元信息。此元信息将是一个 vtable 模拟,包含方法分派的信息。这是为了避免包含此信息的额外框。

JS 中的元信息(很多其他对象共享的某个对象)自然映射到原型,所以第一步就是获取对象的原型。这可以用 单态完成Object.getPrototypeOf()。但是,似乎无论你尝试什么,你都会失去单态性。

例如,在以下代码中,对对象的构造函数的访问将是超态的:

所以问题是,如何在原型中存储一些信息然后检索它,而不会失去单态性?也许,一些“知名”符号可以在这里提供帮助?还是有其他解决方案?

谢谢!


例如,我刚刚尝试使用迭代器符号,但没有成功 -proto在迭代器位置访问仍然是超态的:


更新 2020/10/21

我使用了一个出色的deoptigate工具来跟踪代码反优化:

npx deoptigate --allow-natives-syntax -r esm src_js/draft3.js

0 投票
2 回答
124 浏览

haskell - Haskell 隐式参数和多态递归

我对 GHC 用户指南的“隐式参数和多态递归”一章有疑问。

代码是

章节说

在前一种情况下,len_acc1 在它自己的右手边是单态的,所以隐式参数 ?acc 不会传递给递归调用。在后一种情况下,由于 len_acc2 具有类型签名,因此对多态版本进行递归调用,该版本将 ?acc 作为隐式参数。

问题是

  • 在这种情况下,“单态在它自己的右手边”是否意味着类型 len_acc1 :: (?acc :: Int) => [a] -> p?为什么ghci说len_acc1 :: (?acc::Int) => [a] -> Int

  • 为什么第一个函数是单态的,而第二个不是?如果我的理解是正确的,反之亦然。

  • 或者可能意味着类型是len_acc1 :: [a] -> Int,但每种情况都指的是?acc隐式值,所以我认为类型应该提到(?acc :: Int)约束。

  • 这种单态性如何暗示隐式参数没有传递给函数?

0 投票
1 回答
65 浏览

rust - 为什么我可以在结构的类型参数中编写函数类型?

如果我理解正确,在 Rust 中,每个闭包类型都有一个无法写出的唯一类型。我也认为这适用于函数,但是,我能够执行以下操作,其中我在 and 的返回类型中显式编写类型get_struct_1参数get_struct_2

我认为 Rust 在处理类型参数的方式上是单态的。所以如果我这样做

程序将在运行时动态确定运行哪个f,但FooStruct<F>版本避免了动态调度。

这个例子似乎不同意这一点。如果该x = get_struct_2();行在if语句中,编译器将无法确定是否x保存了函数的包装版本foobar.

0 投票
1 回答
76 浏览

recursion - Julia 是否对递归多态类型执行代码单态化?

我注意到在执行代码单态化的语言(例如:C++、Rust 等)中实现多态递归类型是非常困难的,如果不是不可能的话。这通常是因为编译器需要为该类型的每个可能的实例化生成代码,这通常会导致无限递归。

支持这一点的语言通常使用类型擦除。编译器不会尝试实例化下一个递归调用,因为它已经知道类型的布局。

Julia 执行代码单态化,但它支持多态递归。我的猜测是,它通过延迟实例化泛型类型或函数直到它被实际调用来做到这一点。但是,我认为这最终可能会使用大量内存,尤其是当递归非常深时。所以我的问题是,julia 是否仍会为多态递归类型执行代码单态化,还是回退到类型擦除或其他方法?