Я знаю, что этот вопрос задан и ответил много раз, но я до сих пор не понимаю, почему помехи ограничениям на тип данных - это плохо.
Например, возьмите Data.Map k a. Для всех полезных функций, связанных с Map, требуется ограничение Ord k. Таким образом, существует неявное ограничение на определение Data.Map. Почему лучше держать его неявным, а не позволять компилятору и программистам знать, что Data.Map нужен заказный ключ.
Кроме того, указание конечного типа в объявлении типа является чем-то распространенным, и его можно рассматривать как способ "супер", ограничивающий тип данных.
Например, я могу написать
data User = User { name :: String }
и это приемлемо. Однако это не ограниченная версия
data User' s = User' { name :: s }
После того, как все 99% функций, которые я напишу для типа User, не нуждаются в String, и немногие, для которых, вероятно, потребуется s быть IsString и Show.
Итак, почему слабая версия User считается плохой:
data (IsString s, Show s, ...) => User'' { name :: s }
в то время как оба User и User' считаются хорошими?
Я прошу об этом, потому что много времени, я чувствую, что я излишне сужу свои данные (или даже функции), просто чтобы не было распространять ограничения.
Update
Насколько я понимаю, ограничения типа данных применимы только к конструктору и не распространяются. Поэтому мой вопрос заключается в том, почему ограничения типа данных не работают должным образом (и распространяются)? Это расширение в любом случае, так почему бы не создать новое расширение, выполняющее data правильно, если оно было сочтено полезным сообществом?