Bester Weg, um Ad-hoc-Polymorphismus in Haskell zu implementieren?

Ich habe eine polymorphe Funktion wie:

convert :: (Show a) => a -> String
convert = " [label=" ++ (show a) ++ "]"

Aber manchmal möchte ich ihm eine Data.Map übergeben und eine ausgefallene Schlüsselwertkonvertierung durchführen. Ich weiß, dass hier keine Musterübereinstimmung möglich ist, da Data.Map ein abstrakter Datentyp ist (gemäßdiese ähnliche SO-Frage), aber ich habe bisher keine Guards verwendet, und ich bin mir nicht sicher, ob ViewPatterns hier Abhilfe schaffen (und sie aus Gründen der Portabilität lieber vermeiden).

Das ist mehr was ich will:

import qualified Data.Map as M

convert :: (Show a) => a -> String
convert a 
    | M.size \=0 = processMap2FancyKVString a -- Heres a Data.Map
    | otherwise = " [label=" ++ (show a) ++ "]" -- Probably a string

Aber das funktioniert nicht, weil M.size nichts anderes als eine Data.Map aufnehmen kann.

Speziell versuche ich, das @ zu ändesl-Hilfsprogrammfunktion in der Functional Graph Library, um die Farbgebung und andere Attribute von Kanten in der GraphViz-Ausgabe zu behandeln.

Aktualisiere

Ich wünschte, ich könnte alle drei Antworten von TomMD, Antal S-Z und Luqui auf diese Frage akzeptieren, da sie alle verstanden, was ich wirklich fragte. Ich würde sagen

Antal S-Z gab die "eleganteste" Lösung für die FGL an, würde aber auch das meiste Umschreiben und Überdenken erfordern, um sie in ein persönliches Problem umzusetzen.TomMD hat eine großartige Antwort gegeben, die in Bezug auf Anwendbarkeit und Korrektheit irgendwo zwischen Antal S-Z und Luqui liegt. Es ist auch direkt und auf den Punkt, den ich sehr schätze und warum ich seine Antwort gewählt habe.luqui gab die beste Antwort, die ich in der Praxis wahrscheinlich verwenden werde (da ich ein Student bin, und dies ist nur ein Wegwerf-Code, um einige Ideen zu testen). Der Grund, den ich nicht akzeptierte, war, dass die Antwort von TomMD wahrscheinlich anderen Menschen in allgemeineren Situationen besser helfen wird.

Mit diesen Worten sind sie alle ausgezeichnete Antworten und die obige Klassifizierung ist eine grobe Vereinfachung. Ich habe auch den Fragentitel aktualisiert, um meine Frage besser darzustellen (Nochmals vielen Dank für die Erweiterung meines Horizonts an alle!

Antworten auf die Frage(6)

Ihre Antwort auf die Frage