问题标签 [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 - 为什么 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 充分回答。当然,任何进一步的想法都会受到赞赏。
我将根据清晰度和建议的要求对其进行编辑。您可以提供的任何想法、论文等将不胜感激。
haskell - 在 where 子句中键入签名
我编写了一个类似于Data.Enumerator.List.map
使 an与提供不同类型的 anIteratee
兼容的函数。Enumerator
Stream
import Data.Enumerator
如果我省略 的类型签名go
,这将正常工作。但是,我想包括它,但我无法确定正确的签名应该是什么。我认为应该是这样的:
go :: Monad m => Step ai m b -> Iteratee ao m b
但这不起作用。
我需要一些关于为go
.
f# - List.max<'T> 是如何工作的?
从 MSDN 文档中,签名List.max
为:
我的问题是:
- 编译器如何静态验证是否
'T
支持比较操作? - 是
requires
指定类型约束的关键字吗?如果是,我可以用它指定哪些所有类型的约束? - 我可以定义自己的约束类型吗,就像我可以在 Scala 中使用类型类一样?
c++ - 什么是 C++ 中的参数和包含多态性
我正在阅读地址https://cs.senecac.on.ca/~chris.szalwinski/archives/btp200.082/content/adhoc.html的一些 C++ 文本。
在 一节UNIVERSAL POLYMORPHISM
中,作者提到了关于Parametric
和Inclusion
多态性。我不太确定我是否理解这一点,尤其是为什么Parametric
多态是在编译时实现的,而Inclusion
多态是在运行时实现的?
谁能给我一个清楚的解释或一个例子,好吗?
c++ - 使用 C++ 制作泛型类型 - 具有共享实现的模板
例如,考虑一个简单的数据结构,如链表。在 C 中,它可能看起来像:
我希望拥有相同的结构和函数,但通过声明字段的类型来进行更好的类型检查,该data
字段始终是指向某物的指针。使用示例:
但我不想为每种类型的指针生成一个实现,就像普通模板一样。换句话说,我想要一些更像来自 Java、ML 和其他语言的泛型或参数类型的东西。我只是尝试了下面的代码作为测试。无类型的类 C 部分最终将进入实现文件,而模板和函数声明将在头文件中。我假设它们会被优化掉,我会留下与 C 版本大致相同的机器代码,除了它会被类型检查。
但是我对 C++ 不是很好......有没有办法改进这一点,或者使用更惯用的 C++,也许是模板专业化?
go - 我如何绕过没有参数多态性的 Go?
我是 Go 新手,但我读过 Go 常客不会错过参数多态性。每次我尝试学习一门新语言时,我都会使用L99 问题列表来进行一些练习。
即使我尝试编写像第一个问题一样微不足道的东西(在 Go 中这将是一条语句,获取切片的最后一个元素),我将如何将其编写为一个接受任何类型切片的函数和(使用我上面引用的那条语句)返回该切片的最后一个元素?
我认为即使该语言没有参数多态性,也必须有一些惯用的“Go”方式来做到这一点,以便 Go 常客声称他们不会错过参数多态性。否则,如果示例比列表的最后一个元素更复杂,您将需要一个函数来执行每种类型的任务。
我错过了什么?
java - 参数多态性斗争
除了为作业实现 Bag & List 之外,下一步是创建有序版本。一个要求是使用正确的类型参数和约束来指定参数化接口 OrderedCollection。我的问题是实施它。
存在一个接口Collection <E>
并定义为
它由类实现
我有结构工作,现在正在尝试实现排序版本。为此并满足部分要求,我创建OrderedCollection
为
因为它扩展了已经定义的方法Collection
,并且唯一需要的新功能是一个compareTo()
方法。
但是,当我尝试OrderedList
通过声明来实施时
我收到一条错误消息,指出
据我了解错误消息,我需要指定一个参数类型,它可以有效替代接口声明中给出的参数类型。但是,我已经尝试过
作为实现声明者,但随后我收到一条警告,指出扩展上存在语法错误。
我如何满足这里的要求?
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]
函数的语言和库,因为它引入了以下二分法:
- 允许人们观察有关集合/关系如何物理存储的实现细节
- 失去对非确定性的影响
显然两者sortBy :: (a -> a -> Ordering) -> Set a -> [a]
都是shuffle :: Set a -> Data.Random.RVar [a]
有用的,无可争议的,并且将被包括在内。事实上,sortBy
有一个更通用的类型,如sortBy :: (TheUnorderedFoldableClassIAmTryingToName f) => (a -> a -> Ordering) -> f a -> [a]
.
这个想法叫什么?如果我离开基地,我在哪里离开基地路径?
haskell - rank-3(或更高)多态性的用例?
我已经看到了一些 rank-2 多态性的用例(最突出的例子是ST monad),但没有一个比这更高的用例。有谁知道这样的用例?
types - 排序参数包装函数
假设使用几个内置的和用户定义的 Z3 排序,例如 Int、Bool、S1、S2 ......,是否有一种方法可以编写一个通用的排序包装和展开函数,该函数从排序 A 转换为排序 B 并返回?例如
我目前手动涵盖每个案例,例如
这样的包装可以从给定的一组自动创建,但我更喜欢可能的通用解决方案。