问题标签 [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.
haskell - 什么是类型量词?
许多静态类型语言具有参数多态性。例如在 C# 中可以定义:
在呼叫站点中,您可以执行以下操作:
这些类型有时也写成这样:
我听说有人说“forall 就像类型级别的 lambda 抽象”。所以 Foo 是一个函数,它接受一个类型(例如 int)并产生一个值(例如一个 int -> int 类型的函数)。许多语言推断类型参数,以便您可以编写Foo(3)
而不是Foo<int>(3)
.
假设我们有一个f
类型为 的对象forall T. T -> T
。我们可以对这个对象做的首先是Q
通过写给它一个类型f<Q>
。然后我们返回一个 type 的值Q -> Q
。但是,某些f
' 是无效的。例如这个f
:
因此,如果我们“调用” f<int>
,那么我们会返回一个带有 type 的值,int -> int
一般来说,如果我们“调用” f<Q>
,那么我们会返回一个带有 type 的值Q -> Q
,所以这很好。但是,通常认为这f
不是 type 的有效事物,因为根据您传递的类型forall T. T -> T
,它会做不同的事情。forall 的想法是明确不允许这样做。另外,如果 forall 是类型级别的 lambda,那么存在什么?(即存在量化)。由于这些原因,似乎 forall 和 exists 并不是真正的“类型级别的 lambda”。但那它们是什么?我意识到这个问题相当模糊,但有人可以帮我解决这个问题吗?
一个可能的解释如下:
如果我们看逻辑,量词和 lambda 是两个不同的东西。量化表达式的一个例子是:
所以有两部分要考虑:一个用于量化的集合(例如整数)和一个谓词(例如 P)。Forall 可以看作是一个高阶函数:
带类型:
Exists 具有相同的类型。Forall 就像一个无限合取,其中 S[n] 是集合 S 的第 n 个元素:
Exists 就像一个无限析取:
如果我们对类型进行类比,我们可以说∧的类型类比是计算交集类型∩,∨的类比类型是计算并集类型∪。然后我们可以定义 forall 和存在于类型上,如下所示:
所以forall是一个无限的交集,exists是一个无限的并集。他们的类型是:
例如多态恒等函数的类型。这
Types
是所有类型的集合,->
是函数的类型构造函数,=>
是 lambda 抽象:现在类型的东西
forall T:Type. T -> T
是一个值,而不是从类型到值的函数。它是一个值,其类型是所有类型 T -> T 的交集,其中 T 涵盖所有类型。当我们使用这样的值时,我们不必将其应用于类型。相反,我们使用子类型判断:这向下转换
id
为有 typeint -> int
。这是有效的,因为int -> int
也出现在无限交集。我认为这很好用,它清楚地解释了 forall 是什么以及它与 lambda 的不同之处,但这个模型与我在 ML、F#、C# 等语言中看到的不兼容。例如在 F# 中你
id<int>
可以获取整数上的标识函数,这在此模型中没有意义:id 是值上的函数,而不是返回值上的函数的类型上的函数。
有类型理论知识的人可以解释一下到底什么是 forall 和存在的吗?“forall 在类型级别上是 lambda”在多大程度上是真的?
java - Java:抽象方法中的多态返回类型?
我在抽象 java 类中有以下代码:
编译得很好。但是,如果我在任何地方调用它,编译器都会抱怨:
有没有办法要求抽象方法返回应该实现多个接口的东西?
注意:不,我不能创建一个特殊的接口来实现我喜欢的两个。GWT 有像 Label 这样的小部件,它们已经实现了上述接口,我想使用上述小部件。
编辑:我从这里得到了这样做的想法(第 22 页):
c - 将多态函数作为参数传递给 C 中的另一个函数
关于这个问题,我只在 C 中工作。
我有两个函数原型:
int pkg_permserver(const char *service, const char *protocol, int backlog, void (*errlog) (char *msg))
int pkg_permserver_ip(const char *ipOrHostname, const char *service, const char *protocol, int backlog, void (*errlog)(char *msg))
和以下代码段:
我正在编写一个测试单元。我需要为函数的每个参数测试每种情况(有效/无效)。
我无法修改上述功能。pkg_permserver 和 pkg_permserver_ip 有完全相同的参数,除了 pkg_permserver_ip 有另外的 IpOrHostname。
如果我要编写另一个函数“test_permserver_ip”,我不想复制 - 粘贴来自 test_permserver 的部分(因为参数相同)。
我想到的是类似 int test_permserver(char * port, int which_function);
我想避免为 test_permserver_ip 复制相同的代码(对于与 test_permserver 相同的参数) pkg_permserver_ip 的测试函数尚未编写。
这是上述两个函数的代码:
scala - 用于过滤输入列表的 Scala 多态函数
寻求更优雅的解决方案
我有这段代码,我只是在不需要进行任何错误处理的测试用例中使用它。它的作用是:
- 获取字符串的输入列表
- 使用 DSJSonmapper.parseDSResult 方法解析它们
- 过滤它们并从每个 Either 中提取 Right 值(Left 是一个例外)
代码如下:
现在,我还没有做很多多态函数,但这很有效。不过我觉得有点丑。有没有人有更好的建议,如何完成同样的事情。
我知道这将归结为个人喜好。但欢迎提出建议。
inheritance - Parametric Polymorphism vs Subtype polymorphism F#
What is the difference (if any) between these two F# type signatures?
and
Do they mean the same thing in this case?
msdn says the following about the (:>) Type Constraint
This would indicate that the two signatures are saying the same thing. So Functionally, how are they different?
scala - 在 scala 中以参数方式保存闭包的数据结构
我正在 Scala 中实现一个 GUI 事件系统。我有类似的东西:
我想将事件侦听器闭包存储在(多)映射中,如下所示:
我的问题是,有没有办法重写它,以便存储闭包的函数签名可以是 EventObject 或任何子类?类似于以下内容:
这样我就可以在定义侦听器函数时知道子类型:
c - C 编程:void* - 为什么不是参数多态?
为什么说我们可以用 void* 在 C 编程中实现参数多态性是不正确的?
教授提出了这个问题,没有回答。我相信 void* 实际上是被认为是参数多态性的非常低级别的东西,但有更强有力的理由吗?
scala - Scala将递归有界类型参数(F有界)转换为类型成员
我将如何转换:
类型成员?
即,我想要以下内容:
但我遇到了困难,因为名称 A 已经在类型细化中采用。这个问题是相似的(并且产生自):F-bounded quantification through type member instead of type parameter?
java - Java中的高级多态性
我在我的大学里有高级编程课程,但我很难理解这段代码的工作原理。
为什么这段代码会打印“Collection<?>”?
polymorphism - 松散的自然变换只是没有自然性的自然变换吗?
免费在Theorems 的第 4 页!, Philip Wadler 说,参数性可以用松散的自然变换来表示。他是否指的是函数式编程语言中的参数多态函数是自然转换而没有证明其自然性的事实?由于我还没有找到宽松自然变换的适当定义,所以这是我目前的想法。