我是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中做事似乎很容易,但我不知道如何处理多种数据类型。
答案 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)) []]