您希望您的地图将功能应用于您的树携带的任何标签。这意味着使用作为转换函数给出的函数将任何出现的a
更改为出现的 。b
为此,您需要弄清楚如何处理Stree
. 现在,Null
很容易——它首先不会依赖a
。更棘手的是如何处理Fork
。在Fork
中,有一个a
,还有两个Stree
s,所以你需要 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
请在评论中澄清这是否足以帮助您解决问题:我(和这里的许多其他人)可以澄清,但希望您学习如何做到这一点,而不仅仅是交给您代码。