【发布时间】:2017-11-17 19:04:53
【问题描述】:
我在树上遇到了一些问题,我试图制作一个简化的家谱(家谱树),我只从一个人开始,比如说鲍勃爷爷,我会尽力画这个:
BOB
|
/ \
SIMON RUDY
/ \ / \
ROBBIE MARTHA TOM ISABEL
所以,鲍勃爷爷和奶奶有 2 个孩子(在这里没关系)西蒙和鲁迪,然后西蒙和鲁迪各有 2 个孩子(只有 1 个父母再次重要),请注意,这不一定是树我想做一个例子,你们可以用来帮助我。我想把它作为一个数据家族,然后有一个函数来启动“根”,这将是 Bob 爷爷,然后有另一个函数可以让我将某人添加到树中,就像添加 Bob 的后裔一样。
到目前为止,这就是我的atm(我尝试了其他东西并彻底改变了它):
module Geneaology where
data Family a = Root a [Family a] | Empty deriving (Show, Read)
main :: IO()
main = do
root :: String -> Family
root a = ((Root a) [Empty])
现在,这根本不起作用并给我一个解析错误:
t4.hs:9:10: parse error on input ‘=’
我已尝试解决此问题并更改代码以寻找其他方式,并且也看到了其他帖子,但没有任何进展...
我想我已经说清楚了,提前谢谢xD
【问题讨论】:
-
你忘了说
main做了什么!例如main = do print (root "Bob")。 -
反过来,从下往上构建树会容易得多。因为一旦你创建了 Bob 的节点就不能“修改”它,你不能在不拆开整棵树并重新组装的情况下向他“添加”后代。相反,很容易从两个叶子创建 Rudy 的子树,Simon 也是如此,然后最终创建 Bob 作为这两个叶子的父级。
-
另外,一定要看看这个classic advice on designing genealogy software,如果只是因为它是一个令人愉快的阅读。
-
@amalloy 你是什么意思?比如,首先添加最底部的“孩子”?
-
顺便说一句:
Root不是该数据构造函数的好名字。考虑Node或Branch等。如果存在,树的根应该是单个收敛点(在您的示例中为“Bob”。)