我试图定义一个具有以下特征的数据结构:
我很难开始定义这个结构(特别是3-5点)。
。
我最初的方法是尝试将MyRose的子类型(不是工作代码)创建为:
data MyRose sub = MyRose {label :: String, subtype :: sub, children :: [MyRose sub]}
type AtLeastOne a = snoc a [a]
type AtLeastTwo a = snoc a ( snoc a [a] )
...
instance MyRose AtLeastOne where children = AtLeastOne MyRose -- instances to provide defaults
...
instance None STree where children = Nothing我尝试过各种使用数据、新类型、类、类型的方法,现在正在研究类型家族和数据家族。我的方法没有一种是有成效的。
您能给出定义此数据结构的指针吗?婴儿的第一步将是非常有用的--很难低估我在这个话题上的知识水平。
发布于 2022-02-25 18:42:36
在你走疯狂的高级路线之前,我建议你确保简单的路线不够好。简单的路线如下:
data Tree = Node { label :: String, children :: Children }
data Children
= Zero
| One Tree
| Two Tree Tree
| Positive Tree [Tree]
| Many Tree Tree [Tree]这是你的标准:
constructor
Children构造函数表示排序,而每个Children构造函数都可能对进行不同的选择,只有排序之间的不同是对它们可以接受的子级的限制-检查One child1 child2不键入类型H 214G 215发布于 2022-02-25 18:33:12
即使您可以定义它,这类树似乎也很难使用。树的类型必须反映它的整个结构,客户端必须在任何地方都携带该类型,因为树上的所有操作都需要知道这种类型才能做任何事情。他们不可能仅仅拥有一个Rose String之类的东西,他们需要知道确切的形状。
让我们想象一下你的目标已经成功了。然后,您可能有一些示例树t。
t :: OnlyTwo (AtLeastOne None)指示具有两个节点的顶层,每个节点至少有一个子节点,每个子节点都是空的。究竟insert t "hello"的类型应该是什么?deleteMin t的?如果删除单个节点,则无法真正知道树的哪些级别可能需要折叠;如果插入一个节点,则可能需要在何处增加一个级别。
也许您有这些问题的答案,以及一些模糊的用例,这是最好的解决方案。但是既然你要求婴儿的第一个解决方案:我想如果我是你,我会后退一步,问我为什么真的想要这个。您希望通过这个级别的类型细节实现什么?当客户端代码消耗或构建这样的树时,您希望它看起来像什么?这些问题的答案将使问题更加清楚。
https://stackoverflow.com/questions/71269318
复制相似问题