gpt4 book ai didi

haskell - 记录语法和求和类型

转载 作者:行者123 更新时间:2023-12-02 11:57:28 25 4
gpt4 key购买 nike

我有一个关于 Haskell 中求和类型的问题。

我想创建一个由两个或多个其他类型组成的总和类型,每个类型可能包含多个字段。一个简单的例子如下:

data T3 = T1 { a :: Int, b :: Float} | T2 { x :: Char } deriving (Show)

根据我的理解,T1T2 是使用记录语法的数据构造函数。看起来,T3 的定义会随着 T1T2 中字段数量的增加而增长。我的问题是,如果字段数量很大,如何实际处理这些求和类型构造函数?或者,将 sum 类型与记录语法混合是一个好主意吗?

最佳答案

我不太明白您有什么顾虑,但要回答最后一行中的问题:,将求和类型与记录语法混合并不是一个好主意。一般来说,记录仍然是 Haskell 语言的一个弱点;他们根本不能很好地处理范围界定。只要您只有一些具有不同唱片公司的单独类型,通常就没有问题,但一旦出现总和类型或名称冲突,情况就会变得相当糟糕。

特别是,Haskell 允许您对 T3 类型的任何值使用 T1 构造函数的记录字段访问器 – print $ a (T2 'x ') 将在没有警告的情况下进行编译,但在运行时会出现相当难以预见的错误。

在您的示例中,幸运的是,您可以轻松避免这种麻烦:

data T3 = T3_1 T1 | T3_2 T2
deriving (Show)
data T1 = T1 { a :: Int
, b :: Float}
deriving (Show)
data T2 = T2 { x :: Char }
deriving (Show)

现在,您可以编写的任何解构都将经过正确的类型检查以使其有意义。

这种有意义的小型专门子类型的结构通常比单个整体类型更容易处理,特别是当您有许多只处理部分数据结构的函数时.

另一方面,打开构造函数的层会变得极其繁琐,但幸运的是,现在这个问题已经解决了:lens libraries允许您非常整齐地组合访问器/修饰符。

谈到已解决的问题:Nikita Volkov提出了一个非常好的概念来完全取代问题缠身的记录语法。

<小时/>

嗯...实际上这些不是任何正确意义上的子类型,但你明白我的意思。

关于haskell - 记录语法和求和类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37652243/

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