【问题标题】:how to fill record with elements of a Tree如何用树的元素填充记录
【发布时间】:2014-06-29 14:48:30
【问题描述】:

我是 Haskell 的新手,想将自定义树的叶子的值放入记录中。我从这个开始。

data MyTree = A Int | B Int MyTree | C Double | D Double MyTree 

test = B 1 ( B 1( D 0.02(A 2)))


data MyRecord = MyRecord {A, B :: Int, C :: Double, D :: (Int,Double)}
emptyRecord = MyRecord{a = 0, b = 0, c = 0, d =(0,0)}

现在我是这样开始的:

MyTree2MyRecord :: MyTree -> MyRecord
MyTree2MyRecord(A a1) = emptyRecord{a = a1}
MyTree2MyRecord(B b1 myTree) = emptyRecord {b = b1}
MyTree2MyRecord(C c1) = emptyRecord {c = c1}
MyTree2MyRecord(D d1 myTree) = emptyRecord {d = d1}
 where mytree = MyTree2MyRecord -{dont know the recursive call to iterate through the tree and get the values of the leafs} 

我理解简单的例子,比如总结一棵树的叶子等,但无法找到解决这个问题的方法。我真的很感激一个小提示。谢谢大家

【问题讨论】:

  • 它甚至应该做什么?一棵树中有多个整数值,但MyRecord中只有一个,您需要指定如何组合它们的一些想法。

标签: haskell recursion tree record


【解决方案1】:

您的代码存在一些问题:

  • 函数名称应以小写字母开头。因此记录数据结构应该是这样的:

data MyRecord = MyRecord {a, b :: Int, c :: Double, d :: (Int,Double)}

  • 你的函数名应该是这样的:

myTree2MyRecord :: MyTree -> MyRecord

现在查看您的实际代码,您似乎走在了几乎正确的道路上。但为了找到解决方案,您必须回答以下一些问题:

  • Intd :: (Int, Double) 中究竟表示什么?

  • 当您为AB 等数据构造函数进行模式匹配时,您似乎将MyTree ADT 的值分配给记录。想想那里的递归案例。对于这样的输入,您想要什么输出:

myTree2MyRecord (B 1 (B 1 (A 1)))

您当前的实现只是丢弃了其中的 MyTree 的值:

myTree2MyRecord(B b1 myTree) = emptyRecord {b = b1}

不要放弃想想在这种情况下myTree 应该发生什么。这将导致递归解决方案。

最后,为您为问题提供的输入制定您想要的输出:

test = B 1 ( B 1( D 0.02(A 2)))

一旦你回答了这些问题,我想你会重构代码并自己解决这个问题。

【讨论】:

  • 知道了。我已经使用 myTree2MyRecord myTree = fun_help myTree (0,0,0,(0,0)) 之类的帮助函数完成了它,并且覆盖了它的每个案例。非常感谢
  • @user3588998 很高兴你解决了它。还请仔细查看您的MyTree。如果您没有在其中使用某些类型,最好将它们删除或在您的逻辑中适当地使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-16
  • 2019-05-25
  • 1970-01-01
  • 1970-01-01
  • 2016-09-15
相关资源
最近更新 更多