【问题标题】:Trouble Understanding Haskell Trees无法理解 Haskell 树
【发布时间】: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 不是该数据构造函数的好名字。考虑NodeBranch 等。如果存在,树的根应该是单个收敛点(在您的示例中为“Bob”。)

标签: list haskell tree


【解决方案1】:

你有语法错误,你可以在main中用let和lambda创建一个函数,然后使用它

data Family a = Root a [Family a] | Empty deriving (Show, Read)

main :: IO()
main = do
  let root  = (\a  -> Root a [Empty])
  print(root "Bob")

但你也可以在 main 之外定义函数并在后面调用它们:

root :: String -> Family String
root a = Root a [Empty]

main :: IO()
main = do
  print(root "Bob")

【讨论】:

  • 我看到这行得通,问题是我想用函数 root 启动它
  • @Wireless ah ok ok,没看懂,创建一个函数
  • 嘿,我的代码是这样的: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”?
  • @Wireless 太棒了!因此,您的原始问题已得到解答,不要忘记投票并接受;)。现在,这是一个完全不同的问题,如果您为此提出一个新问题会更好。对于未来的读者来说,显然也是如此。不过很简单,我可以给你一个提示,制作你自己的 Show 实例并定义 show 方法
  • 好吧,只是在投票前清除所有疑虑,我总是投票不要担心xD感谢您的帮助!我认为这应该足够了,如果需要我会问一个新问题:D
猜你喜欢
  • 1970-01-01
  • 2021-01-04
  • 2018-02-18
  • 1970-01-01
  • 2023-03-25
  • 2020-07-24
  • 2016-01-22
  • 1970-01-01
  • 2020-01-31
相关资源
最近更新 更多