Problems in Haskell's Type-System
我遇到了一些答案(在这里是这样)说哈斯克尔有许多"黑暗角落"在它的类型系统,以及一些混乱的洞。有人能详细解释一下吗?
提前谢谢
- 是否要发布这些答案的链接?
- 好吧,stackoverflow.com/questions/3770774/…,和stackoverflow.com/questions/822752/…
- 我想对zip2, zip3, zip4等的需求有点问题吧?
我想我应该回答这个问题,特别是因为迄今为止有两个人误解了我的话…
关于不终止,所讨论的评论是戏剧性效果的轻微夸张,并指在价值水平上的不终止。这是在将haskell与定理证明者进行比较的背景下进行的,这是对某些人的回答,他们提到类型强制的正确性属性是他们特别欣赏的。从这个意义上说,存在于其他空类型的是一个"缺陷",因为它改变了像A -> B这样的类型的含义,从"给定的A,生成的B"变为"给定的A,或者生成的B,或者使程序崩溃",从正确性证明的角度来看,这显然不太令人满意。
它与几乎所有的日常编程都是完全无关的,也不比任何其他通用语言差,因为,当然,图灵完整性需要不终止的可能性。
我对UndecidableInstances没有任何问题。实际上,在值级别上,它比更让我困扰,因为它只在编译时崩溃GHC,而不是完成的程序。不过,OverlappingInstances是另一回事,而且GHC扩展的临时混乱提供了一些最自然需要依赖类型的东西,这当然被认为是"混乱的"。
但是请记住,我在Haskell抱怨的大部分事情只是一个问题,因为其他的基础非常扎实。与其他静态类型语言中的大多数类型系统相比,它们甚至不够连贯,不足以被称为"错误的",而清理我称为"杂乱"的东西则是一个活跃且持续的研究领域。
- 谢谢你的澄清。我对你所说的话感到惊讶,但我没有去仔细阅读引述的短语。
- 在吹毛求疵的层面上,顺便说一下,我将区分"程序崩溃"和"不终止"。记住我们的口号——输入良好的程序不会出错!
- @在实践中,是的,当然。在类型强制正确的背景下,区分不同类型的是在泰坦尼克号上重新排列甲板椅。我可能应该说一些像"…或者计算为",但是…我想是诗歌执照吧?
- 抱歉打断了,不过谢谢!
实际上,哈斯克尔的类型系统没有问题,也没有杂乱的漏洞。Haskell98可以完全推断类型。它拥有所谓的"主体类型"属性,也就是说,任何给定的表达式最多只能有一个最一般的类型。但是,有一系列的表达式是好的、有用的和有效的,但是在haskell 98下不输入。其中最重要的是排名较高的类型。forall a b. (a -> b) -> a -> b是一个(无趣的)一级类型的例子,也就是说forall只是在外面。forall b. -> (forall a. a -> a) -> b -> b是一个无用但可能的类型的例子,它不是一级的,不能用haskell98表示。更高级别的类型是打破主体类型属性的许多事情之一。
随着对基本haskell98系统添加了越来越多的扩展,开始在编写真正强大的类型(表示不同类型的多态性和不同类型的约束)的能力和具有尽可能多的完全类型推断代码的能力之间进行权衡。在可能的边缘,类型可能变得杂乱和复杂,有时你会碰到一些看起来应该工作但不应该工作的东西。但是在那一点上,你通常正在做所谓的"类型级编程",你的大量应用程序逻辑已经嵌入到类型本身中,并通过一个组合类型类技巧的国家,你已经连接到编译器,本质上,运行类型作为一个程序在编译时。
顺便说一下,我不同意卡曼的观点,即潜在的不终止是类型检查程序中一个混乱的妥协。我认为这是一个非常有用的特性,实际上是在类型级别上实现完整性的先决条件,只有当您明确地要求编译器开始允许许多不可靠的东西时,您才会冒险使用它。
- 说到吹毛求疵——与这个问题并不完全相关,但当人们用这样的大写我的用户名时,它看起来真的很奇怪,因为它是我的第一个首字母+中间首字母+姓氏。我可能应该把这里的显示名称改成其他地方使用的更合理的名称。
- @camcann—固定资本化:—)
- 我认为不值得为这个添加一个全新的答案,但也许你也可以提到单态限制?我发现这是一个相当丑陋的复杂的类型系统,往往咬很多初学者。
- @动植物门——我同意也不同意。mr有点尖锐,但它不是类型系统固有的(从haskell 2010年开始),一旦你克服了最初的困惑,就不会引起太大的痛苦。所以,像违约一样,这会使事情变得有点复杂,但我认为这是一种令人恼火但微不足道的方式,而不是一种深奥的方式。
- @SCLV你所说的"从2010年的哈斯克尔消失"是什么意思?Haskell2010报告仍然提到它:haskell.org/onlinereport/haskell2010/…。为什么它不是类型系统固有的呢?这当然与类型推断的工作方式有关。
- @佩洛托姆——你是对的,它仍然在哈斯克尔2010年,但提案应该仍然在轨道上的哈斯克尔修订很快。它不是类型系统固有的,因为关闭它很简单——它只是一个附加规则,停留在类型推断之上。如果编写的内容违反了它,则会得到一个错误——它不会更改类型良好的表达式的类型。
- @sclv在与默认规则交互时,会间接地以意想不到的方式更改好类型表达式的类型:let p = print、let (f, g) = ((+), (-))。
- 授予点:—)
- 回答很好,谢谢!
所以你指的是卡曼所说的"哈斯克尔式的系统充满了漏洞,由于不终止和其他混乱的妥协"?我认为他在谈论不可决定的实例扩展,可能还有其他一些。
然后你提到诺曼,我只能假设,他说"哈斯克尔的类型体系是雄心勃勃和强大的,但是它在不断地改进,这意味着历史的结果有一些不一致。"我相信他有想法,但当他看到这个问题时会让他澄清。
- 我怀疑诺曼·拉姆齐在谈论各种实验性的GHC扩展之间不完全理解的相互作用,特别是像小工具、重叠实例、类型族之类的东西——我见过的东西(也许是McBride?)称为"可怕的大杂烩"。