我有一些基本上像这样结构的记录类型:
type Body x = { x | pos: (Int,Int) }
type Bubble = Body { radius: Int }
type Box = Body { width: Int, height: Int }
现在我想要一个混合列表中的任何一个,并在Body
零件上执行一些操作,但仍然是特殊情况处理Box
和Bubble
其他时间。例如,具有(省略了实现):
mv: (Int,Int) -> Body a -> Body a
bubble: Bubble
box: Box
我想
map (mv (1,1)) [box,bubble]
但这失败了,因为 Elm 认为列表中的类型不兼容。
Box
现在我可以像这样将es 和s包装Bubble
在 ADT 中:
type BodyWrap = BoxWrap Box | BubbleWrap Bubble
但随后我需要在每种情况下都进行解包和重新包装。如果我想折叠混合列表,它会变得更加混乱。这个 gist中有一个例子。
有没有更优雅的方式来处理这种情况?