问题标签 [parametric-polymorphism]

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 投票
3 回答
1180 浏览

c# - 通过 C# 中的“动态重载”进行单/双调度

为什么 C# 本身不支持通过基于参数类型的“动态重载”进行双重分派?我看到这需要动态调度,但由于虚拟方法调用也是动态调度的,这对语言来说并不奇怪。那么为什么这个特性不是 C# 的一部分呢?使用反射实现此功能的最优雅的解决方案是什么(也许有一些库)?

确实是更新,因为Method在这个例子中不是虚拟的并且只接受一个参数,这仍然是单次调度,但调度的“基数”在这个问题中并不那么重要,只要它> 0。

0 投票
2 回答
178 浏览

f# - F#:算术运算符和多态性丢失(值限制?)

此代码无法编译:

我猜统一器修复了与它们第一次出现相关联的类型f参数g。是什么支配了这个过程?我认为这与“价值限制”非常相似,但f已经g被 eta 扩展了!这是一个难题。

我肯定会想象在整数类型上键入具有临时多态性的预定义运算符背后有一些黑魔法,但这只是我的猜测。任何信息表示赞赏。

0 投票
1 回答
312 浏览

scala - 具有参数类型的 Scalacheck/Scalatest

我想用 scalatest 和 scalacheck 测试一个通用堆栈。到目前为止,我有这个:

然而,这显然不能编译。如何将泛型类型指定为测试的一部分?

0 投票
2 回答
281 浏览

haskell - 输入没有意义的签名

考虑

这个签名有什么有意义的定义吗?也就是说,一个不简单地忽略论点的定义?

似乎有很多这样的签名可以立即排除。

0 投票
4 回答
225 浏览

f# - 将函数作为参数传递并重载它

我想为我的函数计时,其中一些函数最多使用三个参数。现在我在下面使用相同的代码,但对这三个代码有一些变化。

我想用这个替换这三个功能。

但是如果我使用它工作的三个函数,我会收到类型不匹配的错误。是否可以将函数作为参数发送并像这样使用它?

0 投票
7 回答
106872 浏览

javascript - 什么是 Javascript 中的多态性?

我已经阅读了一些我可以在互联网上找到的关于多态性的文章。但我想我不能完全理解它的含义和它的重要性。大多数文章都没有说明它为什么重要以及我如何在 OOP 中实现多态行为(当然是在 JavaScript 中)。

我无法提供任何代码示例,因为我不知道如何实现它,所以我的问题如下:

  1. 它是什么?
  2. 为什么我们需要它?
  3. 这个怎么运作?
  4. 如何在 javascript 中实现这种多态行为?

我有这个例子。但是很容易理解这段代码的结果。它没有给出关于多态性本身的任何清晰概念。

0 投票
3 回答
2317 浏览

haskell - 是否可以在 Haskell 中定义一个具有两种可能类型的输入参数的函数?

就我自己的理解而言,我想在 Haskell 中定义一个函数,它接受两个参数——要么都是整数,要么都是字符。它对参数进行了一些琐碎的检查,如下所示:

我知道这不会编译,因为它不知道它的 args 是 Num 类型还是 Char 类型。但我不能让它的参数多态,比如:

因为那时我们说它必须是正文中的 Char(或 Int)。

是否可以在 Haskell 中执行此操作?我想也许创建一个自定义类型?就像是:

但我也不认为这是有效的。一般来说,我很困惑是否在 Haskell 中的函数显式为 ONE 类型或多态到类型类之间存在中间立场,禁止在函数体中使用特定类型。

0 投票
1 回答
527 浏览

scala - 将 F 有界类型表示为抽象类型成员

我想将 F 有界多态性转换为抽象类型成员。

到目前为止,一切都很好。

让我们定义一个实例:

并尝试使用它:

F 有界版本工作正常。

def moveF[A <: FBoundedMovable[A]](a: A, to: Vect2): A = a.moveTo(to)

我知道可以将类型边界添加到方法定义站点:

def move2[A <: Movable { type Self = A }](a: A, to: Vect2): A = a.moveTo(to)

但是是否可以在 Movable 特征声明中指定关系?如果不是 - 为什么?

编辑 1

我已经意识到我遇到了什么问题。

假设我们要声明某物是我们世界中的一个单位。

trait WorldUnit extends Movable with Damageable

所有单元都是可移动和可损坏的。

我们战斗计算的东西只关心那个东西Movable with Damagable。它不关心它是单元还是建筑物。

但是我们可以有这样的代码:

我注定要使用 F 有界类型吗?

编辑2:

Attempting to model F-bounded polymorphism as a type member in Scala没有回答这个问题——我之前已经尝试过,它丝毫不会影响返回类型,它仍然是 a.Self。

编辑3:

我找到了http://blog.jessitron.com/2014/02/when-oo-and-fp-meet-mytype-problem.html但问题仍未解决。

基本上,每当您有收藏并想挑选一个时:

(collection: Seq[Movable]).collectFirst { m: Movable if m.someCondition => m }- 您无法指定类型绑定,因此编译器无法证明 A#Self =:= A?

0 投票
1 回答
525 浏览

types - 为什么函数参数在 Ocaml 中不能是多态的?

说如果我有以下功能:

它被类型检查器拒绝,我真的不明白为什么类型检查会拒绝它。因为 f 可以是一个多态函数(比如id),并且类型检查器应该允许它。有人可以解释一下吗?

0 投票
0 回答
365 浏览

types - 一个函数是否包含可在 Typed Racket 中键入的函数列表的第一个参数?

我可以在无类型的 Racket 中编写一个简单的函数,调用curry-all它接受一个函数列表,所有这些函数的第一个参数都接受相同类型的值,并生成一个函数列表,它们的第一个参数是 curried。

有关上述函数的运行示例,请参阅 pasterack 上的此代码段

这是一个有效的函数,但我不确定是否可以输入 Typed Racket,因为它具有多态类型结构。本身的类型curry已经相当复杂了,显然 的类型curry-all需要更复杂。

我在键入这个函数时做了一个相对简单的尝试,尽管我很清楚它不会像我喜欢的那样运行:

显然,如果所有函数都具有相同的类型(这不是毫无价值的!),则此方法有效,但如果它们具有不同的参数,即使它们的第一个参数的类型是共享的,它也会失败。

有没有办法指定这个函数的类型,以便它在更一般的情况下工作?