Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Search 如何定义搜索树上的地图和折叠?_Search_Haskell_Tree_Higher Order Functions - Fatal编程技术网

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自己做了什么,因为他无法解释。