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

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

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 на этот вопрос, поскольку все они поняли, о чем я действительно спрашивал. Я бы сказал:

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

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

12
задан Community 23 May 2017 в 12:16
поделиться