3

我有一个定义为的搜索树:

data (Ord a) => Stree a = Null | Fork (Stree a) a (Stree a) deriving Show 

我必须定义两个函数,mapStree:

mapStree :: (Ord b, Ord a) => (a -> b) -> Stree a -> Stree b

和折叠树:

foldStree :: (Ord a) => (b -> a -> b -> b) -> b -> Stree a -> b

我不完全了解发生了什么,也不知道该怎么做。

4

2 回答 2

5

您希望您的地图将功能应用于您的树携带的任何标签。这意味着使用作为转换函数给出的函数将任何出现的a更改为出现的 。b

为此,您需要弄清楚如何处理Stree. 现在,Null很容易——它首先不会依赖a。更棘手的是如何处理Fork。在Fork中,有一个a,还有两个Strees,所以你需要 takea -> b和 take的函数Stree a -> Stree b。对于前者,调用mapStree为您提供一个函数,对于后者,mapStree f具有您需要的调用签名(通过部分应用程序!)。

因为foldStree,你有一些累积类型b和你的标签类型a,以及一个累积函数,它接受两个类型b的值和一个类型的值a并产生一个b. 这很有帮助,至少因为累积函数反映Fork了树中任何给定的值:通过递归,您可以假设您有来自 left 和 right 的结果Stree,并且只需将它们与a您拥有的值结合起来在中间给出一个新的b值来递递递归。b参数为您提供了足够的foldStree标准值,以通过获取每个叶子的值来开始整个事情。

因此,您foldStree还需要在可能的构造函数上定义:为一个值选择参数Null,然后为一个值,在将所有内容与参数组合函数组合之前Fork,它需要递归到两个值。Stree

请在评论中澄清这是否足以帮助您解决问题:我(和这里的许多其他人)可以澄清,但希望您学习如何做到这一点,而不仅仅是交给您代码。

于 2010-10-20T23:07:48.880 回答
1

我强烈推荐本课程的第 5 讲。

于 2010-10-21T19:47:28.297 回答