2016-08-06 14 views
3

Diese Zuordnung ist zwischen einem GType und einer Funktion, die eine Instanz dieses GType in einen IO-String umwandelt. Ich mache eine Funktion, die ein Element nimmt und eine String-Repräsentation dieses Elements bekommt.Zuordnung von GType zur Funktion Umwandlung eines Typs in einen IO-String

mapping = 
    [ (Types.gTypeHTMLSourceElement, HTMLSourceElement.getSrc ) 
    , (Types.gTypeHTMLObjectElement, HTMLObjectElement.getData ) 
    , (Types.gTypeHTMLTimeElement , HTMLTimeElement.getDateTime) 
    , (Types.gTypeHTMLElement  , HTMLElement.getInnerText ) 
    , ... 
    ] 

gibt diesen Fehler:

Couldn't match type ‘HTMLObjectElement’ with ‘HTMLSourceElement’ 

I ghcjs-dom verwenden. Wie kann ich diesen Code ohne Fehler kompilieren lassen? Komme ich dem Problem richtig zu?

Wenn jemand besser Antwort als Alec Antwort bekommen kann, werde ich ihre Antwort akzeptieren.

+0

Ich glaube nicht, dass Sie dies der richtige Weg nähern, aber Sie wahrscheinlich zu kompilieren bekommen würde 'RankNTypes' benötigen und fügen Sie' Mapping :: [(GType, forall eine IO (a. - > String))] '. – Alec

+0

@Alec eine bessere Möglichkeit, es zu nähern? Wenn ich basierend auf dem Knotennamen wechselte, wäre es nicht typsicher. – 2426021684

+0

Erneut mein Kommentar gelesen, sollte es wirklich gelesen haben Mapping :: [(GType, für alle a. A -> IO String)]]. Aber in Bezug auf Ihre Frage bin ich mir nicht sicher, was der beste Weg wäre ... Ich denke, Sie könnten eine Typklasse 'class Inhalt a where {getContents :: a -> IO String}' dann Instanzen wie 'instance contents HTMLSourceElement machen wo {getContents = HTMLSourceElement.getSrc} '. – Alec

Antwort

0

Ich denke, der richtige Weg, um das Problem anzugehen, ist nur eine Funktion, die die Verzweigung basierend auf dem GType macht.

toString :: GObjectClass obj => obj -> IO String 
toString obj | obj `isA` gTypeHTMLSourceElement = getSrc . castToHTMLSourceElement 
      | obj `isA` gTypeHTMLObjectElement = getData . castToHTMLObjectElement 
      | obj `isA` gTypeHTMLTimeElement = getDateTime . castToHTMLTimeElement 
      | obj `isA` gTypeHTMLElement = getInnerText . castToHTMLElement 
      | ... 
+0

Downvoter, würden Sie die down-Abstimmung rechtfertigen? Ich würde mich für Feedback interessieren ... – Alec