如何使用Scrap Your Boilerplate变换树?

时间:2010-03-06 04:30:39

标签: haskell tree traversal

我是Haskell的新手,所以我想弄清楚如何进行树遍历。

以下是我在几篇论文中看到的公司示例(略有变化)

data Company  = C [Dept]               deriving (Eq, Show, Typeable, Data)
data Dept     = D Name Manager [Unit]  deriving (Eq, Show, Typeable, Data)
data ThinkTank= TK Name [Unit]         deriving (Eq, Show, Typeable, Data)
data Unit     = PU Employee | DU Dept  deriving (Eq, Show, Typeable, Data)
data Employee = E Person Salary        deriving (Eq, Show, Typeable, Data)
data Person   = P Name Address         deriving (Eq, Show, Typeable, Data)
data Salary   = S Float                deriving (Eq, Show, Typeable, Data)
type Manager  = Employee
type Name     = String
type Address  = String

我想做的是将员工从他所在的地方转移到某个特定部门。这个人可以在部门或ThinkTank。

只要你做一种类型,在SYB中做事似乎很容易,但我不知道如何处理多种数据类型。

3 个答案:

答案 0 :(得分:6)

cs.uu.nl上的教程似乎已经消失了。我挣扎了一段时间,通过论文梳理,然后写了this tutorial。希望你觉得它很有用。

答案 1 :(得分:5)

您需要从SYB教程开始,

主要的遍历功能是:

利用这些来了解API,然后你就可以解决它了。

SYB泛型不过是一个初学者Haskell练习。

答案 2 :(得分:0)

不太熟悉SYB,所以我将使用uniplate显示一个示例。该示例仅将员工单位从其部门或智囊团中移除,但您很可能很容易弄清楚如何扩展它以执行您想要的操作。

> let jack = E (P "Jack" "The Road") (S 7)
> import Data.Generics.Uniplate.Data
> transformBi (filter (/= PU jack)) $ C [D "Operations" (E (P "Charles" "Seattle") (S 700000)) [PU jack]]
C [D "Operations" (E (P "Charles" "Seattle") (S 700000.0)) []]