- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个定义为的搜索树:
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:
foldStree :: (Ord a) => (b -> a -> b -> b) -> b -> Stree a -> b
我不完全明白发生了什么,也不知道该怎么做。
最佳答案
您希望您的 map 将函数应用到树携带的任何标签。这意味着任何 a
的出现将更改为 b
的事件,使用给定的函数作为转换函数。
为此,您需要弄清楚如何处理 Stree
的每个可能的构造函数.现在,Null
很简单——它不依赖于 a
首先。更棘手的是如何处理 Fork
.在 Fork
, 有一个 a
, 还有两个 Stree
它无处不在,所以你需要使用 a -> b
的函数那需要Stree a -> Stree b
.对于前者,调用 mapStree
给你一个函数,对于后者,mapStree f
具有您需要的调用签名(通过部分应用程序!)。
对于 foldStree
, 你有一些积累类型 b
和你的标签类型 a
, 和一个累加函数,它采用 b
类型的两个值和一个 a
类型的值并产生 b
.这很有用,至少因为累积函数反射(reflect)了你在任何给定 Fork
可能拥有的东西。在树中:通过递归,你可以假设你从左和右都有结果 Stree
, 剩下的就是将它们与 a
结合起来你在中间的值(value)给一个新的 b
递归递归的值。 b
参数 foldStree
为您提供足够的标准值,通过获取每片叶子的值来启动整个过程。
因此,您的 foldStree
还需要在可能的构造函数上定义:为 Null
挑选参数值,然后为 Fork
值,它需要递归到Stree
在使用参数组合函数组合所有内容之前的值。
请在评论中澄清这是否足以帮助您解决问题:我(和这里的许多其他人)可以澄清,但希望您学习如何去做,而不是仅仅交给您代码。
关于search - 如何在搜索树上定义映射和折叠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3982968/
我是一名优秀的程序员,十分优秀!