Как сделать дерево с помощью Scrap Your Boilerplate? - PullRequest
7 голосов
/ 06 марта 2010

Я новичок в 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

То, что я хотел бы сделать, это перевести сотрудника из того места, где он находится, в определенный отдел. Этот человек может быть в отделе или мозговом центре.

Кажется, что легко делать вещи в SYB, если вы делаете один тип, но я не уверен, как обращаться с несколькими типами данных.

Ответы [ 3 ]

6 голосов
/ 18 января 2013

Учебник на cs.uu.nl, похоже, исчез. Некоторое время я боролся с этим, просматривая бумаги, затем написал этот урок . Надеюсь, вы найдете это полезным.

5 голосов
/ 06 марта 2010

Вам нужно начать с учебника по SYB,

Основные функции обхода:

Поэкспериментируйте с ними, чтобы получить представление об API, и вы все уладите.

Обобщения SYB - это немного больше, чем упражнение для начинающих на Haskell.

0 голосов
/ 07 марта 2010

Не слишком знаком с 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)) []]
...