问题标签 [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 投票
6 回答
20316 浏览

haskell - 为什么 Haskell 的 `head` 会在一个空列表上崩溃(或者为什么 *不* 它返回一个空列表)?(语言哲学)

其他潜在贡献者请注意:请不要犹豫,使用抽象或数学符号来表达您的观点。如果我发现您的答案不清楚,我会要求说明,但请随意以舒适的方式表达自己。

需要明确的是:我不是在寻找“安全” head,也不是head特别有意义的选择。head问题的核心是和的讨论head',它们提供了上下文。

我已经用 Haskell 破解了几个月了(以至于它已经成为我的主要语言),但我承认我对一些更高级的概念和语言哲学的细节并不了解(尽管我非常愿意学习)。那么我的问题与其说是技术问题(除非它是,我只是没有意识到),不如说它是哲学问题之一。

对于这个例子,我说的是head.

我想你会知道的,

这从head :: [a] -> a. 很公平。显然,不能返回(挥手)无类型的元素。但同时,定义很简单(如果不是微不足道的)

我在某些陈述的评论部分看到了一些关于这个的小讨论。值得注意的是,一位 Alex Stangl 说

“有充分的理由不让一切都“安全”,并在违反先决条件时抛出异常。

我不一定质疑这个断言,但我很好奇这些“好理由”是什么。

此外,保罗约翰逊说,

'例如,您可以定义“safeHead :: [a] -> Maybe a”,但现在不是处理空列表或证明它不会发生,您必须处理“Nothing”或证明它不会发生。

我从那条评论中读到的语气表明,这是难度/复杂性/某事的显着增加,但我不确定我是否理解他在那里提出的内容。

一位 Steven Pruzina 说(在 2011 年,不少于),

“有一个更深层次的原因,例如‘head’不能防崩溃。要多态但处理空列表,‘head’必须始终返回任何特定空列表中不存在的类型的变量。它会是Delphic 如果 Haskell 能做到这一点……”。

允许空列表处理是否会丢失多态性?如果是这样,怎么会,为什么?是否有特殊情况可以使这一点显而易见?这部分由@Russell O'Connor 充分回答。当然,任何进一步的想法都会受到赞赏。

我将根据清晰度和建议的要求对其进行编辑。您可以提供的任何想法、论文等将不胜感激。

0 投票
2 回答
2892 浏览

haskell - 在 where 子句中键入签名

我编写了一个类似于Data.Enumerator.List.map使 an与提供不同类型的 anIteratee兼容的函数。EnumeratorStream

import Data.Enumerator

如果我省略 的类型签名go,这将正常工作。但是,我想包括它,但我无法确定正确的签名应该是什么。我认为应该是这样的:

go :: Monad m => Step ai m b -> Iteratee ao m b

但这不起作用。
我需要一些关于为go.

0 投票
2 回答
303 浏览

f# - List.max<'T> 是如何工作的?

从 MSDN 文档中,签名List.max为:

我的问题是:

  • 编译器如何静态验证是否'T支持比较操作?
  • requires指定类型约束的关键字吗?如果是,我可以用它指定哪些所有类型的约束?
  • 我可以定义自己的约束类型吗,就像我可以在 Scala 中使用类型类一样?
0 投票
3 回答
2068 浏览

c++ - 什么是 C++ 中的参数和包含多态性

我正在阅读地址https://cs.senecac.on.ca/~chris.szalwinski/archives/btp200.082/content/adhoc.html的一些 C++ 文本。

在 一节UNIVERSAL POLYMORPHISM中,作者提到了关于ParametricInclusion多态性。我不太确定我是否理解这一点,尤其是为什么Parametric多态是在编译时实现的,而Inclusion多态是在运行时实现的?

谁能给我一个清楚的解释或一个例子,好吗?

0 投票
3 回答
1133 浏览

c++ - 使用 C++ 制作泛型类型 - 具有共享实现的模板

例如,考虑一个简单的数据结构,如链表。在 C 中,它可能看起来像:

我希望拥有相同的结构和函数,但通过声明字段的类型来进行更好的类型检查,该data字段始终是指向某物的指针。使用示例:

但我不想为每种类型的指针生成一个实现,就像普通模板一样。换句话说,我想要一些更像来自 Java、ML 和其他语言的泛型或参数类型的东西。我只是尝试了下面的代码作为测试。无类型的类 C 部分最终将进入实现文件,而模板和函数声明将在头文件中。我假设它们会被优化掉,我会留下与 C 版本大致相同的机器代码,除了它会被类型检查。

但是我对 C++ 不是很好......有没有办法改进这一点,或者使用更惯用的 C++,也许是模板专业化?

0 投票
4 回答
3273 浏览

go - 我如何绕过没有参数多态性的 Go?

我是 Go 新手,但我读过 Go 常客不会错过参数多态性。每次我尝试学习一门新语言时,我都会使用L99 问题列表来进行一些练习。

即使我尝试编写像第一个问题一样微不足道的东西(在 Go 中这将是一条语句,获取切片的最后一个元素),我将如何将其编写为一个接受任何类型切片的函数和(使用我上面引用的那条语句)返回该切片的最后一个元素?

我认为即使该语言没有参数多态性,也必须有一些惯用的“Go”方式来做到这一点,以便 Go 常客声称他们不会错过参数多态性。否则,如果示例比列表的最后一个元素更复杂,您将需要一个函数来执行每种类型的任务。

我错过了什么?

0 投票
1 回答
536 浏览

java - 参数多态性斗争

除了为作业实现 Bag & List 之外,下一步是创建有序版本。一个要求是使用正确的类型参数和约束来指定参数化接口 OrderedCollection。我的问题是实施它。

存在一个接口Collection <E>并定义为

它由类实现

我有结构工作,现在正在尝试实现排序版本。为此并满足部分要求,我创建OrderedCollection

因为它扩展了已经定义的方法Collection,并且唯一需要的新功能是一个compareTo()方法。

但是,当我尝试OrderedList通过声明来实施时

我收到一条错误消息,指出

据我了解错误消息,我需要指定一个参数类型,它可以有效替代接口声明中给出的参数类型。但是,我已经尝试过

作为实现声明者,但随后我收到一条警告,指出扩展上存在语法错误。

我如何满足这里的要求?

0 投票
1 回答
385 浏览

haskell - Data.Foldable 用于无序容器

我正在研究用于数据库操作的 Haskell-meets-SQL 语言,以及与之配套的通用类型类库,在任何有意义的地方抄袭 Hackage。

因为数据库查询优化器的一个重要目标是消除不必要的排序,所以保留对实际上需要排序的位置的静态表示非常重要。这使我们为折叠定义一个类型类。

HaskellData.Foldable有:(省略与我要表达的观点无关的默认定义)

在我看来,这个类忽略了一个区别,出于实际目的,对于大多数 Haskell 应用程序来说并不那么重要,但对数据库设置更感兴趣。也就是说:所有Data.Foldable实例都带有排序。

这个概念的概括名称是什么,适用于不对元素进行排序的容器类型?

对于 HaskellData.Set来说效果很好,因为Ord实现需要上下文。但是,排序要求是一个实现工件,对于许多有用的类型,所使用的排序可能没有任何域级别的含义。

对于更一般的集合fold :: Monoid m => t m -> m,其定义本身大多是正确的(也是如此foldMap)。我说主要是因为它的类型包括结合律(通过 的定义Monoid)但不包括所需的交换律。其他变种甚至不存在。

我不想在不需要的地方引入排序。我也不想在无法跟踪的地方引入非确定性。我有兴趣构建一种在任何地方都没有toList :: Set a -> [a]函数的语言和库,因为它引入了以下二分法:

  1. 允许人们观察有关集合/关系如何物理存储的实现细节
  2. 失去对非确定性的影响

显然两者sortBy :: (a -> a -> Ordering) -> Set a -> [a]都是shuffle :: Set a -> Data.Random.RVar [a]有用的,无可争议的,并且将被包括在内。事实上,sortBy有一个更通用的类型,如sortBy :: (TheUnorderedFoldableClassIAmTryingToName f) => (a -> a -> Ordering) -> f a -> [a].

这个想法叫什么?如果我离开基地,我在哪里离开基地路径?

0 投票
2 回答
1180 浏览

haskell - rank-3(或更高)多态性的用例?

我已经看到了一些 rank-2 多态性的用例(最突出的例子是ST monad),但没有一个比这更高的用例。有谁知道这样的用例?

0 投票
1 回答
176 浏览

types - 排序参数包装函数

假设使用几个内置的和用户定义的 Z3 排序,例如 Int、Bool、S1、S2 ......,是否有一种方法可以编写一个通用的排序包装和展开函数,该函数从排序 A 转换为排序 B 并返回?例如

我目前手动涵盖每个案例,例如

这样的包装可以从给定的一组自动创建,但我更喜欢可能的通用解决方案。