Search 如何定义搜索树上的地图和折叠?
我有一个搜索树,定义为:Search 如何定义搜索树上的地图和折叠?,search,haskell,tree,higher-order-functions,Search,Haskell,Tree,Higher Order Functions,我有一个搜索树,定义为: 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) -&g
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
我不完全明白发生了什么,也不知道如何做到这一点。您希望地图对树上的任何标签应用函数。这意味着
a
的任何出现都将使用作为转换函数给出的函数更改为b
的出现
要做到这一点,您需要弄清楚如何使用Stree
的每个可能的构造函数。现在,Null
很容易——它首先不依赖于a
。更棘手的是如何使用Fork
。在Fork
中,有一个a
,还有两个Stree
s,因此您需要使用a->b
和Stree a->Stree b
的函数。对于前者,mapStree
的调用为您提供了一个函数,对于后者,mapStree f
具有您需要的调用签名(通过部分应用!)
对于foldtree
,您有一些累加类型b
和标签类型a
,还有一个累加函数,它接受类型b
的两个值和类型a
的一个值,并生成一个b
。这很有帮助,一点也不因为累加函数反映了在树中任何给定的分支
处可能拥有的内容:通过递归,您可以假设您同时拥有左分支和右分支的结果,它只剩下那些与<>代码> a \代码>值相结合的中间值,以给出一个新的<代码> b>代码>值来传递递归。b
参数到foldStree
为您提供了足够的标准值,可以通过为每个叶获取一个值来开始整个过程
因此,您的折叠树
也需要在可能的构造函数上定义:为Null
值选择参数,然后为Fork
值选择参数,在使用参数组合函数组合所有内容之前,它需要递归到两个Stree
值中
请在评论中澄清这是否足以帮助您解决问题:我(和这里的许多其他人)可以澄清,但希望您学习如何做,而不是仅仅将代码交给您。我强烈推荐第五讲。您第二次尝试mapStree f(左叉x右叉)
看起来不错:您需要将mapStree f
应用于left
和right
,并且您需要将f
应用于x
@a.d.f(x)
在您的尝试中没有做您认为是做的事情-它会将f和y作为连续参数传递给Fork,这将导致类型错误。看起来您理解函数应用程序语法,因为(mapStree f xt)和(mapStree f yt)是对的,所以我猜这可能只是一个输入错误(主题外)。GHC可以自动派生Functor和Foldable来定义上述两个函数(前提是Ord a=>
约束不存在)。Ord的作用尚不清楚。我假设这棵树是按Ord实例从左到右排序的。在这种情况下,“mapStree”可以假设它的函数是单调的(即,保持顺序),还是mapStree需要在进行时重新排序?教授谈论的大部分内容都不清楚,我甚至不确定他是否知道Ord自己做了什么,因为他无法解释。