2016-07-22 8 views
0

Dies ist eine Follow-up-Frage zu diesem question. Jemand hat dort vorgeschlagen, dass es sinnvoller wäre, das Typnetzwerk zu einer Instanz von vectorSpace zu machen.make network instance von vectorSpace

newtype Network = Network [(Matrix Double, Vector Double)] 

instance AdditiveGroup Network where 
    (Network n1) ^+^ (Network n2) = Network $ zipWith (\(m,v) (n,w) -> (m+n,v+w)) n1 n2 
    (Network n1) ^-^ (Network n2) = Network $ zipWith (\(m,v) (n,w) -> (m-n,v-w)) n1 n2 

instance VectorSpace Network where 
    type Scalar Network = Double 
    lambda *^ (Network n) = Network $ map (\ (m,v) -> (lambda*m,lambda*v)) n 

Aber wenn ich versuche zu kompilieren, bekomme ich einen Fehler, der besagt, dass ich eine illegale Instanz für 'Scalar' geschrieben habe. Kann mir jemand erklären, was ich falsch gemacht habe?

+0

Sie sollten die Fehlermeldung in Zukunft einfügen. Es macht es viel einfacher und schneller herauszufinden, was vor sich geht. –

Antwort

0

Der Fehler kommt aus der Tatsache, dass die Fähigkeit, type in einer Klasse zu deklarieren und die Instanz ist nicht Standard Haskell, es ist Teil der type families extension ist. Erste dieser Fehler loszuwerden, ist nicht schwer, man muss nur die folgende Sprache Pragma am Anfang der Datei hinzufügen:

{-# LANGUAGE TypeFamilies #-} 

aber dann könnten Sie ein Problem mit der Tatsache haben, dass Sie nicht definiert zeroV oder negateV in Ihrer AdditiveGroup Instanz. Ich bin mir nicht sicher, wie Sie diese definieren werden ... Sie können sogar davonkommen, ohne sie zu definieren (Sie werden jedoch Warnungen erhalten und etwas kann zur Laufzeit abstürzen).