作为Haskell的初学者,我目前正试图了解BST。目前我正在尝试按顺序在树上执行折叠。
这是我到目前为止所得到的,但它会产生错误。
public String getIMEI(Activity activity) {
TelephonyManager telephonyManager = (TelephonyManager) activity
.getSystemService(Context.TELEPHONY_SERVICE);
return telephonyManager.getDeviceId();
}
我现在真的傻眼了,因为我现在已经工作了很长时间才弄明白问题究竟是什么,但我似乎没有找到解决方案。
答案 0 :(得分:3)
按顺序表示您(1)首先处理左子树,(2)然后处理节点本身,(3)最后处理正确的子树。
根据您的功能,BinaryTree a
的定义可能是:
data BinaryTree a = Leaf | Node (BinaryTree a) a (BinaryTree a)
这意味着有两种情况:如果是叶子,则没有数据,所以我们只返回给定的值:
inorder' _ a Leaf = a -- with an uppercase, otherwise it does match all
对于Node
案例,我们上面已经说明了如何运作:
inorder' f a (Node left val right) = inorder' f c right
where b = inorder' f a left
c = f b val
或完整:
inorder' :: (b -> a -> b) -> b -> BinaryTree a -> b
inorder' _ a Leaf = a
inorder' f a (Node left val right) = inorder' f c right
where b = inorder' f a left
c = f b val
在这种情况下,BinaryTree
定义如下:
data BinaryTree a = Leaf a | Node (BinaryTree a) a (BinaryTree a)
如果叶子有值,我们只需要修复第一个子句:
inorder' :: (b -> a -> b) -> b -> BinaryTree a -> b
inorder' f b (Leaf a) = f b a
inorder' f a (Node left val right) = inorder' f c right
where b = inorder' f a left
c = f b val