问题标签 [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.
scala - 泛型函数类型中的通用量化
阅读关于编程语言中的类型和多态性的论文,我想知道是否有可能用 Scala 对类型成员表达类似的通用量化。论文中的示例:
这是泛型身份函数的一种类型,他们的论文语言Fun中的以下示例是正确的:
有什么方法可以在 Scala 中表达类似的东西吗?
这与类型构造函数不同,因为当是泛型函数的type GenericId[A] = A => A
类型时,它是类型操作∀A.A ↦ A
scala - 建模两种类型之间的二元关系
有企业和人。用户可以喜欢或发表关于企业的评论,但同样不能发生在一个人身上。当用户发布有关某项业务或喜欢它的内容时,该业务称为该target
喜欢或帖子的:
在这里,我发明了一个T | P[T]
表示类型参数的符号T
,以便它满足某些属性P[T]
(或者T :|: P[T]
如果它具有更多的类型吸引力)。我希望在代码中的其他地方声明如下:
这些对象实际上是证据,类似于 Haskell 类型类。所以这将输入检查:
但不是这个:
就我对 Scala 的了解而言,我无法以令人满意的方式对这种特定的事态进行建模。现在我坚持认为这不是子类型,因为 Business不是:
事实上,Business
完全不了解Post
. 这种关系实际上在Post
和之外Business
。此外,我想上面的代码甚至不会编译开始,因为它是从两次Business
继承的。TargetingRelation
见解是最受欢迎的。
java - 为什么 C++ 和 Java 中的构造函数调用需要显式类型参数?
C++ 和 Java 在处理参数多态性方面有这种相似之处:两者都将类型参数推断为常规函数或方法,但要求程序员在调用构造函数时显式给出类型参数(尽管这在 Java 7 中已更改)。
这种行为背后的技术原因是什么?
编辑:我错误地认为这也适用于 Scala。下面是一个来自 Java 的示例:
这两个都是合法的,但第一个创建一个“原始类型”而不是 a Foo<Integer>
,并执行未经检查的赋值。
r - `NextMethod()` 的内部工作原理
我试图弄清楚是如何NextMethod()
工作的。我在 Chambers & Hastie (edts.)'s Statistical Models in S (1993, Chapman & Hall) 中找到了关于S3 类系统的最详细解释,但我发现关于NextMethod
调用的部分有点晦涩难懂。以下是我试图理解的相关段落(第 268-269 页)。
现在转向作为调用的结果调用的方法
NextMethod()
,这些方法的行为就好像它们是从以前的方法中通过特殊调用调用的一样。对继承方法的调用中的参数在数量、顺序和实际参数名称上与对当前方法的调用中的参数名称相同(因此,在对泛型的调用中)。然而,参数的表达式是当前方法的相应形式参数的名称。例如,假设表达式print(ratings)
调用了方法print.ordered()
。当这个方法被调用NextMethod()
时,这相当于对print.factor()
表单的调用print.factor(x)
,这里x
是x
在框架中的print.ordered()
。如果多个参数与形式参数匹配“...
”,这些参数在对继承方法的调用中表示 y 特殊名称“..1
”、“..2
”等。评估器识别这些名称并适当地对待它们(参见第 476 页的示例)。存在这个相当微妙的定义是为了确保 S 中函数调用的语义尽可能干净地延续到方法的使用中(比较 Becker、Chambers 和 Wilks 的The New S Language,第 354 页)。尤其是:
- 参数从当前方法传递到继承方法,并在
NextMethod()
调用时使用它们的当前值。- 惰性评估继续有效;未评估的论点保持未评估。
- 继承的方法中仍然缺少缺少的参数。
- 通过" " 形式参数传递的
...
参数以正确的参数名称到达。- 框架中与调用中的实际参数不对应的对象将不会传递给继承的方法。”
就参数而言,继承过程基本上是透明的。
我感到困惑的两点是:
- 什么是“当前方法”,什么是“以前的方法”?
- “对继承方法的调用中的参数”,“参数的表达式”和“当前方法的相应形式参数的名称”有什么区别?
一般来说,如果有人能以一种清晰的方式重述上述段落中的描述,我将不胜感激。
set - 适当使用宇宙多态性
我已经在一个 Agda 项目上工作了几个星期,尽我所能地忽略关卡多态性。不幸的是(或者也许幸运的是)我似乎已经到了需要开始理解它的地步。
到目前为止,我只在需要它们作为第二个参数Rel
(或第三个参数REL
)时才使用级别变量。否则我就省略了,直接使用Set
。现在我有一些客户端代码可以显式量化各个级别a
,并尝试将某些类型的表单传递Set a
给我现有的代码,这些代码现在不够多态。在下面的示例中,quibble
代表客户端代码,并且_[_]×[_]_
是≈-List
我现有代码的典型代表,它仅使用Set
.
≈-List
在这里,我可以使用额外的级别参数扩展 的归纳定义,a
以便它可以采用 type 的类型参数Set a
,但是我不清楚输入和输出关系的宇宙应该如何变化。然后问题蔓延到更复杂的定义,例如_[_]×[_]_
我更不确定如何进行。
我应该如何概括给出的示例中的签名,以便quibble
编译?有没有我可以遵循的一般规则?我读过这个。
ocaml - OCaml 的 let 多态实现
我对let polymorphism
in感到困惑OCaml
。
考虑以下代码:
对于 A 和 B,没有问题。但是对于C,OCaml
报错:
因此,对于 A,在评估 时((f 3), (f true))
,f
的类型是'a -> 'a
,对于 B,在评估时let f = g in f
,f
的类型是'a -> 'a
。但是对于 C,在评估 时((f 3), (f true))
,f
的类型是int -> int
。
为什么 Cf
没有 type 'a -> 'a
?
我很难理解OCaml
's
的实现,let polymorphism
如果有人能就这个问题给出一个简明的描述,我将不胜感激。
scala - Scala:理解参数多态性
和有什么区别
和
假设用法看起来像
?
什么时候应该使用其中一种,为什么?虽然我可以理解第二个示例,但我并不真正理解第一个示例的目的。
scala - 编译器无法识别函数重载,因为类型已被删除。如何克服这一点?
我有一个问题,以下代码中名为 fooSome 的两个方法无法编译,因为编译器报告了重复方法名称的问题:
相反,编译器报告没有与名为 fooNoSome 的两个方法发生此类方法名称冲突。所以问题是编译器没有看到“Some[(Int,String)=> Unit]”和“Some[(Int)=> Unit]”之间的区别,而“(Int,String)=> Unit”对于 fooNoSome 方法,被视为与 "( Int ) => Unit" 不同的签名。
我可以通过创建一个用于“Some[(Int, String) => Unit]”案例的类 Some2Args 和一个用于“Some[(Int) => Unit]”案例的类 Some1Arg 来解决这个问题。
我的问题是是否有更优雅、更省力的解决方案。
java - 为什么“TypeToken 集合”被认为是类型安全的?(有效的 Java #29)
Effective Java 中的第 29 项提出了一种实现“类型安全”异构集合的方法,基本上可以归结为如下内容:
然后(由生产者)像这样使用哪个(我想):
像这样(由消费者):
我现在的问题是为什么这被认为是类型安全的?这比仅将列名放入地图或仅使用常规List
/List<Object>
并按索引查找列有什么好处?
这是否以任何方式有效/实际改进了 JDBC ResultsSets 的 .getString/.getInt/.getXXXX 方法?