2016-07-22 18 views
0

Ich habe einen Datentyp, der einen Funktionswert enthält und ich möchte show und read es. Ich weiß, dass ich die Funktion nicht zurück lesen kann, deshalb möchte ich eine Möglichkeit, die Funktion beim Lesen anzugeben.Show und Read-Instanz für einen Datentyp mit Funktionen

Hier ist meine Datentyp:

type Activation = (Vector Double -> Vector Double, Vector Double -> Vector Double) 

    data Layer = L { biases  :: !(Vector Double) 
       , nodes  :: !(Matrix Double) 
       , activation :: Activation 
       } 

    instance Show Layer where 
    show (L biases nodes _) = "(" ++ show biases ++ "," ++ show nodes ++ ")" 

Und ich möchte eine Funktion wie folgt aus:

readLayer :: String -> Activation -> Layer 

Wie würde das funktionieren?

Vielen Dank im Voraus

+0

Nun, Sie ignorieren es beim Shoiwng, also was möchten Sie den Funktionswert beim Lesen füllen? –

+0

Normalerweise würde ich dafür die Funktion 'String -> String -> Aktivierung -> Layer 'verwenden. Aber was hast du probiert, welche Fehler bekommst du? Können Sie eine einfache Funktion erstellen, die einen 'String'" liest "und ein' [Double] 'erzeugt, dann können Sie' Vector.fromList' nützlich finden. – epsilonhalbe

+0

Beachten Sie, dass sich dieser 'readLayer' von der üblichen' Read'-Instanz unterscheidet! – epsilonhalbe

Antwort

3

Wegen der Art und Weise, Sie dies nur tun, um eine Schicht zu zeigen gewählt werden:

readLayer str f = 
    let (biases, nodes) = read str 
    in Layer { biases = biases, nodes = nodes, activation = f } 

Das heißt, Ihre Show-Instanz für eine Schicht ist, ist das gleiche wie die Show-Instanz für (Vektor doppelt, Matrix doppelt).

Die Dinge würden komplizierter, wenn das nicht der Fall wäre.

+0

oder wenn Sie das LANGUAGE Pragma '{- # LANGUAGE RecordWildCards # -}' verwenden, können Sie schreiben 'readLayer str activation = let (vorbelastet, Knoten) = str lesen in Layer {..}' – epsilonhalbe

+1

Ich denke es ist besser zu sei hier strenger. Während die Definition einer solchen Teilfunktion für die Analyse von Eingaben immer problematisch ist, ist es im Allgemeinen am besten, sie zumindest frühzeitig zu scheitern. – dfeuer

+1

@dfeuer ist dies ein Kommentar zu meiner Bemerkung oder einem allgemeinen, ich sehe nicht, auf welche Weise meine Lösung weniger streng ist als die ursprüngliche. Würde die Strictness Annotation im Typ nicht automatisch Verzerrungen/Knoten auswerten? – epsilonhalbe