gpt4 book ai didi

haskell - 为什么 Haskell 没有结构类型记录?

转载 作者:行者123 更新时间:2023-12-02 06:33:00 24 4
gpt4 key购买 nike

我听说 Haskell 被描述为具有结构类型。据我了解,记录是一个异常(exception)。例如,不能使用 HRec2 类型的内容调用 foo,即使 HRecHRec2 仅在名义上有所不同。字段。

data HRec = HRec { x :: Int, y :: Bool }
data HRec2 = HRec2 { p :: Int, q :: Bool }

foo :: HRec -> Bool

拒绝将结构类型扩展到包括记录在内的所有内容是否有一些解释?

是否存在具有结构类型的静态类型语言,甚至对于记录也是如此?对于所有静态类型语言,是否可能存在一些我可以阅读的争论?

最佳答案

Haskell 有结构化类型,但没有结构类型,而且这一点不太可能改变。*

拒绝允许名义上不同但结构上相似的类型作为可互换参数称为类型安全。这是一件好事。 Haskell 甚至有一个新类型声明来提供仅名义上不同的类型,以允许您强制执行更多类型安全。类型安全是一种尽早发现错误而不是在运行时允许错误的简单方法。

除了 amindfv 的好答案(包括通过类型类实现的临时多态性(实际上是程序员声明的功能等效性))之外,还有参数多态性,您可以绝对允许任何类型,因此 [a] 允许任何类型在您的列表中,BTree a 允许您的二叉树中的任何类型。

这给出了“这些类型可以互换吗?”的三个答案。

  1. 不;程序员没这么说。
  2. 相当于特定目的,因为程序员是这么说的。
  3. 不关心 - 我可以对此数据集合执行相同的操作,因为它不使用数据本身的任何属性。

没有 4:编译器会否决程序员,因为他们碰巧使用了几个 Int 和一个 String,就像在其他函数中一样。

*我说过 Haskell 不太可能改变结构类型。有一些讨论引入某种形式的可扩展记录,但没有计划使 (Int,(Int,Int))(Int, Int, Int) 计数相同code> 或 Triple {one::Int, Two::Int, Three::Int}Triple2 {one2::Int, Two2::Int, Three2::Int} 相同.

关于haskell - 为什么 Haskell 没有结构类型记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21071603/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com