cobelius
25.01.2010, 22:03
Hallo Leute,
ich versuche gerade ein Datenflussnetz in Haskell zu schreiben. Kurzer Exkurs: In Datenflussnetz besteht aus mehreren Knoten. Die Knoten wiederum beinhalten wiederum Felder, die einen Wert tragen. Die Felder können Felder anderer Knoten als Empfänger haben, an den sie ihren Wert weitergeben. Dieser Vorgang nennt sich "propagieren". Jeder Container wiederum hat eine Evaluierungs-Funktion, die operationen mit den Werten der Felder des Containers ausführt.
Den Container habe ich nun wie gefolgt definiert:
data Container = Container { containerName :: String
, fields :: [Field]
, changed :: Bool
, evaluator :: Evaluator
} deriving (Eq, Show)
Der Evaluator ist so definiert:
type Evaluator = (String,Container -> [ChangeData])
Ein Evaluator, der zwei Felder eines Container addiert und das Ergebnis in einem anderen Feld ablegt ist zum Beispiel:
addEvaluator :: Evaluator
addEvaluator = ("add",\c ->[((containerName c),"c", ((value(getField c "a")) + (value(getField c "b"))) )])
Die erste Zeichenkette im Tupel habe ich für den Vergleich eingefügt, da ansonsten die Funktion nur Vergleichbar wäre, wenn ich die mit dem Container aufrufe.
Allerdings wei ich jetzt nicht wie ich diesen Vergleich hinbekomme. Wenn ich den Evaluator im Container drin habe, kann hugs eben diesen nicht vergleichen. Aber ich bekomme es auch nicht hin, eine Instanz von Eq für Container zu bauen, weil hugs sich dann beschwert, dass es sich mit dern Standard Instanz überlappen würde.
Weiß jemand abhilfe?
ich versuche gerade ein Datenflussnetz in Haskell zu schreiben. Kurzer Exkurs: In Datenflussnetz besteht aus mehreren Knoten. Die Knoten wiederum beinhalten wiederum Felder, die einen Wert tragen. Die Felder können Felder anderer Knoten als Empfänger haben, an den sie ihren Wert weitergeben. Dieser Vorgang nennt sich "propagieren". Jeder Container wiederum hat eine Evaluierungs-Funktion, die operationen mit den Werten der Felder des Containers ausführt.
Den Container habe ich nun wie gefolgt definiert:
data Container = Container { containerName :: String
, fields :: [Field]
, changed :: Bool
, evaluator :: Evaluator
} deriving (Eq, Show)
Der Evaluator ist so definiert:
type Evaluator = (String,Container -> [ChangeData])
Ein Evaluator, der zwei Felder eines Container addiert und das Ergebnis in einem anderen Feld ablegt ist zum Beispiel:
addEvaluator :: Evaluator
addEvaluator = ("add",\c ->[((containerName c),"c", ((value(getField c "a")) + (value(getField c "b"))) )])
Die erste Zeichenkette im Tupel habe ich für den Vergleich eingefügt, da ansonsten die Funktion nur Vergleichbar wäre, wenn ich die mit dem Container aufrufe.
Allerdings wei ich jetzt nicht wie ich diesen Vergleich hinbekomme. Wenn ich den Evaluator im Container drin habe, kann hugs eben diesen nicht vergleichen. Aber ich bekomme es auch nicht hin, eine Instanz von Eq für Container zu bauen, weil hugs sich dann beschwert, dass es sich mit dern Standard Instanz überlappen würde.
Weiß jemand abhilfe?