Trouble Understanding Haskell Trees
我有一些关于树的问题,我试着做一个简化的家谱树(系谱树),我从只有一个人开始,假设鲍勃爷爷,我会尽我最大的努力画这个:
1 2 3 4 5 6
| BOB
|
/ \
SIMON RUDY
/ \ / \
ROBBIE MARTHA TOM ISABEL |
所以,鲍勃爷爷和奶奶有两个孩子(这不重要),西蒙和鲁迪,然后西蒙和鲁迪都有两个孩子(只有一个家长再次重要),注意,这不一定是我想做的树,但只有一个例子,可以被你们用来帮助我。我想把它作为一个数据家族,然后有一个启动"根"的函数,它将是Bob爷爷,然后有另一个函数,它将允许我向树中添加某人,如AddSimonDescending from Bob。
到目前为止,我有自动取款机(我尝试过其他东西,并把它换了个遍):
1 2 3 4 5 6 7
| 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 ]) |
号
现在,这根本不起作用,给了我一个分析错误:
1
| t4.hs :9:10: parse error on input ‘ =’ |
我尝试过修正这个问题,并改变寻找其他方法的代码,也看到了其他帖子,但没有取得任何进展…
我想我已经说清楚了,提前谢谢。
- 你忘了说main做了什么!以main = do print (root"Bob")为例。
- 相反地,从下到上建造你的树会容易得多。因为一旦创建了Bob的节点,就不能"修改"它,所以在不拆开整棵树并重新组装它的情况下,就不能"添加"他的后代。相反,很容易从两个叶子中创建鲁迪的子树,对西蒙也是如此,然后最终创建Bob作为这两个叶子的父树。
- 此外,如果只是因为这是一个令人愉快的阅读,一定要看看这个关于设计系谱软件的经典建议。
- @阿马洛伊你什么意思?比如,先加最下面的"孩子"?
- 顺便提一句:Root并不是那个数据构造函数的好名字。以Node或Branch等为例,如果存在一个聚合点,那么一棵树的根应该是一个聚合点("bob",在您的示例中)。
- @数据家族中的Adammith?像这样:用data Family a = Node a [Family a] ...代替根?
- @无线是的。你可以随意命名。data Family a = LiterallyAnythingAtAll a [Family a] ...仍然有效,但你知道他们说的:计算机科学只有两个难题,其中一个就是命名问题。(另外两个是缓存无效和一个错误关闭)。
您有语法错误,可以用let和lambda在main中创建一个函数,然后使用它
1 2 3 4 5 6
| data Family a = Root a [Family a ] | Empty deriving (Show, Read)
main :: IO()
main = do
let root = (\a -> Root a [Empty ])
print(root "Bob") |
但是,您也可以在主函数之外定义函数,然后调用它们:
1 2 3 4 5 6
| root :: String -> Family String
root a = Root a [Empty ]
main :: IO()
main = do
print(root "Bob") |
号
- 我看到这是可行的,问题是我想从函数根开始。
- @无线啊,好吧,我不太明白,所以创建一个函数
- 嘿,我得到了这样的代码:module Geneaology where data Family a = Node a [Family a] | Empty deriving (Show, Read) root :: String -> Family String root a = Node a [Empty] main :: IO() main = do print (root"Bob")它给了我如下的输出:Node"Bob" [Empty]我如何使它只打印"bob"?
- @无线技术太棒了!所以你最初的问题得到了回答,不要忘记投票和接受;)。现在,这是一个完全不同的问题,如果你问一个新的问题更好。对于未来的读者来说也是如此。但是很简单,我可以给您一个提示,创建自己的show实例并定义show方法
- 好吧,投票前刚把所有的疑问都解决了,我总是投票,别担心xd谢谢你的帮助!我想这就足够了,如果需要我会问一个新问题:d
- @无线一点也不担心,我一直喜欢帮忙