У меня есть полиморфная функция, например:
convert :: (Show a) => a -> String
convert = " [label=" ++ (show a) ++ "]"
Но иногда я хочу передать ему Data.Map и сделать еще несколько причудливых преобразований значений ключа. Я знаю, что здесь не могу сопоставить шаблон, потому что Data.Map является абстрактным типом данных (согласно этот аналогичный вопрос SO ), но мне не удалось использовать для этого средства защиты, и я не уверен если 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 SZ и luqui на этот вопрос, поскольку все они поняли, о чем я действительно спрашивал. Я бы сказал:
С учетом сказанного, все они являются отличными ответами, а приведенная выше классификация является большим упрощением. Я также обновил заголовок вопроса, чтобы лучше представить мой вопрос (спасибо еще раз спасибо за расширение моего кругозора!