Лучший способ реализовать специальный полиморфизм в Haskell?

У меня есть полиморфная функция, как:

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

Но иногда я хочу передать ему Data.Map и выполнить более необычное преобразование значения ключа. Я знаю, что не могу сопоставить шаблон здесь, потому что Data.Map является абстрактным типом данных (в соответствии сэтот похожий вопрос), но мне не удалось использовать охранники с этой целью, и я не уверен, что ViewPatterns помог бы здесь (и скорее избегал бы их для переносимости).

Это больше, чем я хочу:

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

Но это не работает, потому что M.size не может взять ничего, кроме Data.Map.

В частности, я пытаюсь изменитьСлужебная функция sl в библиотеке функциональных графов для обработки окраски и других атрибутов ребер в выводе GraphViz.

Обновить

Хотел бы я принять все три ответа от TomMD, Antal S-Z и luqui на этот вопрос, так как они все поняли, что я действительно спрашивал. Я бы сказал:

Antal S-Z дал наиболее «элегантное» решение применительно к FGL, но также потребовало бы максимально переписать и переосмыслить, чтобы реализовать в личной проблеме.TomMD дал отличный ответ, который лежит где-то между Antal S-Z и Luqui с точки зрения применимости и правильности. Это также прямо и до такой степени, что я высоко ценю и почему я выбрал его ответ.Luqui дал лучший ответ «заставь это работать быстро», который я, вероятно, буду использовать на практике (так как я аспирант, и это всего лишь небольшой код для проверки некоторых идей). Причина, по которой я не согласился, заключалась в том, что ответ TomMD, вероятно, лучше поможет другим людям в более общих ситуациях.

При этом все они являются отличными ответами, и приведенная выше классификация является грубым упрощением. Я также обновил заголовок вопроса, чтобы лучше представить мой вопрос (Еще раз спасибо, что расширили мой кругозор!

Ответы на вопрос(3)

Ваш ответ на вопрос