问题标签 [adhoc-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 投票
1 回答
213 浏览

haskell - 范畴论中的什么概念可以用来表示一个类型类?

在 Haskell 编程语言中,根据https://en.wikibooks.org/wiki/Haskell/Category_theory#Translating_categorical_concepts_into_Haskell

59.2.2 将分类概念翻译成 Haskell

  1. 我们在该类别Hask及其子类别中工作。

  2. 对象是类型。

  3. 态射是函数。

  4. 接受一种类型并返回另一种类型的东西是类型构造函数。

  5. 接受一个函数并返回另一个函数的东西是高阶函数。

  6. 类型类以及它们提供的多态性是一种很好的方式来捕捉这样一个事实,即在类别理论中事物通常同时定义在多个对象上。

范畴论中的什么概念是类型类表示的?作为 的子类别Hask

0 投票
0 回答
67 浏览

polymorphism - 强制与“强制多态性”不同吗?

  1. 如果只是强制转换是一种多态性,那么强制转换即使在非 oops 语言中也会发生。那么,我想知道“强制”一词是否与“强制多态性”不同?

  2. 如果强制发生在函数调用时,其中在函数调用中传递的参数类型强制转换为函数定义中参数的类型,并且如果同样发生在运算符上,那么我们称之为“强制多态”。这个说法对吗?如果是这样,这种事情是否会在 C 语言(非 oops 语言)中发生?

  3. 在 Java 中,BOXING 概念是强制的一个例子。这也可以被视为“强制多态性”吗?

  4. 在方法调用期间将子类对象引用传递给超类对象引用也可以被认为是“强制多态性”?(我在某处读过)。在这种情况下,向上转换和强制多态性在某种意义上意味着相同。那么,这是正确的吗?

0 投票
1 回答
37 浏览

coq - Coq:我可以使用类型参数作为连续参数的类型吗?

简单来说,我可以写吗

这样这X是一个参数,而不是一个参数,所以我可以让构造函数使用X?

语境

我正在尝试对打字判断进行编码,并且我希望它是多态的,因为我有很多针对不同类型术语(Coq 类型)的打字规则,但所有规则都具有相同的判断形式。

这意味着,对于 Coq types A, B,我希望能够做类似的事情

然后能够inversion在适当的地方(比如说)匹配构造函数type_B_1type_B_2如果知道那X实际上是B.

在哈斯克尔

我基本上是在模拟 GHCGADTs允许的模式:

编译器足够聪明,可以Type_A用作见证termType ~ A- 尽管我认为它不能以同样的方式消除匹配臂inversion

0 投票
1 回答
302 浏览

scala - DataSet/DataStream 类型类接口

我只是在 Flink中尝试使用 Scala类型类。我定义了以下类型类接口:

现在,我想考虑一个这样DataSet的:LikeEvent[_]

以下应用程序运行良好:

打印预期输出

但是,如果我像这样修改语法对象:

我收到以下错误:

因此,在消息的指导下,我进行了以下更改:

之后,错误变为:

我不明白为什么EventSyntax2会导致这些错误,而EventSyntax编译和运行良好。为什么使用案例类包装器EventSyntax2比使用常规类更成问题EventSyntax

无论如何,我的问题是双重的:

  • 我该如何解决我的问题EventSyntax2
  • 实现我的目标最简单的方法是什么?在这里,我只是为了学习而尝试使用类型类模式,但绝对是一种更面向对象的方法(基于子类型)对我来说看起来更简单。像这样的东西:

然后简单地val events: DataSet[Event] = env.fromElements(...)在 main 中使用。

请注意,实现某个类型类的类列表提出了类似的问题,但它考虑了一个简单的 ScalaList而不是 Flink DataSet(或DataStream)。我的问题的重点是在 Flink 中使用类型类模式以某种方式考虑异构流/数据集,以及它是否真的有意义,或者在这种情况下是否应该明确支持常规特征并如上所述继承它。

顺便说一句,你可以在这里找到代码:https ://github.com/salvalcantara/flink-events-and-polymorphism 。

0 投票
0 回答
12 浏览

javascript - 为什么我的基于重载函数的 Eq 约束不能正确推断?

这是使用重载函数作为通用高阶函数的等式约束的简单尝试:

操场

在行A中,类型变量A被推断为string,这似乎很随意。我怎样才能解决这个问题?

0 投票
1 回答
83 浏览

haskell - 编程语言中参数化多态函数(不是临时多态)操作的全部空间是多少?

在A Theory of Type Polymorphism in Programming 的第 349 页第 5 段中,米尔纳说,

对我们来说,程序中存在的多态性是原始多态运算符的自然产物,这些运算符似乎存在于每种编程语言中。此类运算符是赋值、函数应用、配对和元组以及列表处理运算符。

此描述是否定义了完整的参数多态函数集(当我们将列表处理运算符扩展为所有递归数据类型的运算符时)?(+, *, ... 需要以一种特殊的风格定义,它们处理的每种类型都有不同的底层实现)。此外,是否有某种形式模式可以将参数多态函数与必须通过重载(即席)定义的函数分开?

0 投票
1 回答
261 浏览

rust - 这种理解是否正确:特征和函数重载都实现了临时多态性,但方向不同

我正在学习一些多态性。

rust 地址的 wiki 页面trait是一种实现 ad hoc polymorphism 的方法,而 ad hoc polymorphism 的页面说是ad hoc 多态function overloading的一个例子。

根据我目前的理解水平,如果提供不同类型的参数将调用不同的实现,则函数是临时多态的。但是看起来如此不同:在类型参数上添加约束trait,任何类型实现都是可以接受的,而函数重载在具体类型上重载,任何未重载的类型都是不可接受的。function overloadingtraittrait

我可以说traitfunction overloading实现相反方向的临时多态性吗?正如trait专业化和overloading泛化一样?

PS:在c++中,模板特化也可以根据传入的类型参数提供不同的实现,这也是ad hoc多态的一个例子吗?

0 投票
2 回答
140 浏览

haskell - 1:1 类型/类型-类-实例关系是否存在可行且类型安全的替代方案?

这个问题最初是在我研究动态 JS 类型验证器时出现的,它依赖于字典传递样式作为一种相当简单的类型类机制,但我认为它也适用于 Haskell 或其他具有类型类机制的语言。

起初,我认为在具有字典传递样式的设置中允许每个类型有多个类型类实例并不是什么大问题,因为我可以完全控制类型类解析。但实际问题似乎是维护类型安全而不是类型类解析,因为我将使用类型验证器进行演示。由于代码是类型注释的,它在某种程度上与语言无关。

当您应用这些类型时,类型安全性会受到影响,因为可以只编写以下人为的表达式而没有验证器抱怨:

在 Haskell 中,每个实例都有自己独特的类型来防止这种无意义的表达。但是必须从一种类型包装器转换为另一种类型包装器可能很乏味。

是否有可行的、类型安全的替代方案,或者这正是 Haskell 的设计者选择不同类型每类实例简化的原因?

0 投票
1 回答
54 浏览

haskell - 使用类型类规定的返回类型多态性

我有一个类HasFavorite,它为某些域分配了我相应的收藏夹。

现在,我想定义这个:

对于每次调用,rant x都有一个favorite :: d可以解析的具体类型。为什么 Haskell 不能这样做?

我试过添加{-# LANGUAGE ScopedTypeVariables #-},但没有帮助。

0 投票
0 回答
58 浏览

scala - 反射创建案例类的临时多态性 Scala

我需要实现 Ad-hoc 多态性,请考虑以下代码:

然后我运行类似的东西没有问题:

但是,如果我的输入是通过代码的其他部分的反射创建的,并且实际的类类型被删除了,我所拥有的只是一个泛型类型和清单的实例:

有什么办法可以解决BlockProcessor吗?或者也许我可以以某种方式再次使用反射?