gpt4 book ai didi

polymorphism - 在 Elm 中处理具有共享子结构的记录

转载 作者:行者123 更新时间:2023-12-04 14:27:38 27 4
gpt4 key购买 nike

我有一些基本如下结构的记录类型:

type Body x = { x | pos: (Int,Int) }
type Bubble = Body { radius: Int }
type Box = Body { width: Int, height: Int }

现在我想要一个混合列表,并在 Body 上执行一些操作。部分,但仍然是特殊情况处理 BoxBubble其他时间。例如,具有(省略了实现):
mv: (Int,Int) -> Body a -> Body a
bubble: Bubble
box: Box

我想要
map (mv (1,1)) [box,bubble]

但这失败了,因为 Elm 认为列表中的类型不兼容。

现在我可以包装 Box es 和 Bubble在 ADT 中,像这样:
type BodyWrap = BoxWrap Box | BubbleWrap Bubble

但随后我需要在每种情况下进行解包和重新包装。如果我想折叠混合列表,它会变得更加困惑。一个例子在 this gist .

有没有更优雅的方法来处理这种情况?

最佳答案

当使用组合而不是继承时,这个问题就会消失。

不是将整个结构包装在 ADT 中,而是让记录中的一个字段保存一个具有对象特定属性的 ADT:

type Body = { pos: (Int,Int), shape: Shape }
data shape = Bubble Int | Box (Int,Int)

这允许使用 Body 中的共享结构同时匹配 shape只有在必要时。

关于polymorphism - 在 Elm 中处理具有共享子结构的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25129110/

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