gpt4 book ai didi

haskell - 记录语法中具有大量构造函数的代数数据类型的替代方案

转载 作者:行者123 更新时间:2023-12-02 17:08:39 24 4
gpt4 key购买 nike

我有一个自定义数据类型来包含景观元素(云、太阳、山等)。我需要有它们的列表,所以我不能使用不同的类型和通用的类型类。

它们共享构造函数中的大部分字段,但有些字段具有其他字段所没有的属性(例如,云是否下雨)。

到目前为止,我有一种具有不同构造函数的数据类型:

data Element = Sun {
elemColorStart :: Color,
elemColorEnd :: Color,
elemCoords :: Coords,
elemPeriod :: Float,
elemSize :: Float,
elemSteps :: Step,
elemTime :: Float
}
| Cloud {
elemKind :: CloudKind,
elemColorMain :: Color,
elemCoords :: Coords,
elemRans :: [Float],
elemSize' :: Size',
elemSteps :: Step,
elemTime :: Float
}
... etc

或者,我可以有一个包含所有可能属性的通用构造函数,并且在不需要时不初始化它们,尽管这看起来更糟。

这看起来不太“Haskelly”,事实上这种方法通常是面向对象的。 我做错了什么?欢迎任何其他可能的方法;这不是一项作业,所以我实际上没有任何限制。

最佳答案

将事物隔离到它们自己的数据类型中,并使 Element 成为它们的总和:

data Sun = Sun {
colorStart :: Color,
colorEnd :: Color,
coords :: Coords,
period :: Float,
size :: Float,
steps :: Step,
time :: Float
}

data Cloud = Cloud {
kind :: CloudKind,
colorMain :: Color,
coords :: Coords,
rans :: [Float],
size :: Size',
steps :: Step,
time :: Float
}

data Element = SunElement Sun | CloudElement Cloud

现在,您可以为孤立的事物拥有专用的 API,就像关注点分离带来的所有好处一样。

哦,顺便说一句,我已经删除了字段名称上的前缀,因为现在我们有了 DuplicateRecordFields 扩展。

顺便说一句,你会发现this question有用。

关于haskell - 记录语法中具有大量构造函数的代数数据类型的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55443997/

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