Haskell - 预订编号的树

时间:2016-06-17 16:14:47

标签: haskell preorder

我准备从非程序语言考试。我有测试任务的例子,我不知道如何解决它。

任务如下:

给出两个树结构:

data Tree a = Nil1 | Node1 a [Tree a]
data NumTree a  = Nil2 | Node2 (a,Int) [NumTree a]

写函数

numberTree :: Num a => Tree a -> NumTree a

将按预订返回编号为NumTree a的内容。

我试过这个,但不知道如何继续。

numberTree tree = numberTree' tree 1

numberTree' :: Num a => Tree a -> Int -> NumTree a
numberTree' Nil1 _ = Nil2
numberTree' (Node1 num list) x = (Node2 (num,x) (myMap x numberTree list))

我不知道如何写这样的myMap,因为它应该返回树和累积的预订号,但我不知道如何做到这一点。

欢迎任何建议。

2 个答案:

答案 0 :(得分:3)

您可以在此使用mapAccumL :: (acc -> x -> (acc, y)) -> acc -> [x] -> (acc, [y])

  

mapAccumL函数的行为类似于mapfoldl的组合;它将一个函数应用于列表的每个元素,从左到右传递一个累加参数,并将该累加器的最终值与新列表一起返回。

查看类型,尝试连接匹配的线,主函数看起来像

import Data.List (mapAccumL)

data Tree a = Nil1 | Node1 a [Tree a]  deriving Show
data NumTree a  = Nil2 | Node2 (a,Int) [NumTree a] deriving Show

numberTree :: Tree a -> NumTree a
numberTree tree = tree2
   where
   (_, [tree2]) = mapAccumL g 1 [tree]
   g n Nil1 = (n, Nil2)
   g n (Node1 x trees) = (z, Node2 (x,n) trees2)
      where
      (z, trees2) = .... 
  

mapAccumL g(n + 1)树

不需要Num a =>约束。您不访问节点的值,只需计算节点,无论它们携带什么:

  

> numberTree(Node1 1.1 [Node1 2.2 [Node1 3.3 [],Nil1],Node1 4.4 []])
  Node2(1.1,1)[Node2(2.2,2)[Node2(3.3,3)[],Nil2],Node2(4.4,4)[]]

答案 1 :(得分:2)

这对library(dplyr) d <- data.frame(group = c(rep("A",10),rep("B",10),"A"), value = c(seq(1,10,1),seq(101,110,1),10000)) d %>% group_by(group) %>% mutate(upper=quantile(value, 0.75) + 2.5*IQR(value), lower=quantile(value, 0.75) - 2.5*IQR(value)) monad很有用,它负责通过访问每个节点的递归调用来线程化用于对每个节点编号的值。

State