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