7 Stimmen

Wie kann man einen Baum mit Scrap Your Boilerplate umwandeln?

Ich bin neu in Haskell, so dass ich versuche, herauszufinden, wie man Baum-Traversalen zu tun.

Hier ist das Beispiel des Unternehmens (mit einer leichten Änderung), das ich in mehreren Zeitungen gesehen habe

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

Ich möchte einen Mitarbeiter von seinem derzeitigen Standort in eine bestimmte Abteilung versetzen. Diese Person könnte in einer Abteilung oder einem ThinkTank sein.

Es scheint einfach zu sein, Dinge in SYB zu tun, solange man nur einen Typ verwendet, aber ich bin mir nicht sicher, wie man mit mehreren Datentypen umgeht.

8voto

user1989402 Punkte 81

Das Tutorium auf cs.uu.nl scheint verschwunden zu sein. Ich habe mich eine Weile damit herumgeschlagen und Papiere durchforstet, dann schrieb ich diese Anleitung . Ich hoffe, Sie finden es nützlich.

5voto

Don Stewart Punkte 136046

Sie müssen mit einem SYB-Tutorial beginnen,

Die wichtigsten Traversalfunktionen sind:

Spielen Sie damit herum, um ein Gefühl für die API zu bekommen, und Sie werden es herausfinden.

SYB generics ist allerdings etwas mehr als eine Haskell-Übung für Anfänger.

0voto

yairchu Punkte 21749

Da ich mit SYB nicht sehr vertraut bin, zeige ich ein Beispiel mit uniplate stattdessen. Das Beispiel entfernt nur die Mitarbeitereinheit aus ihrer Abteilung oder Denkfabrik, aber Sie werden wahrscheinlich leicht herausfinden, wie Sie es erweitern können, um zu tun, was Sie wollen.

> 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)) []]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X