Я знаю, что этот вопрос задан и ответил много раз, но я до сих пор не понимаю, почему помехи ограничениям на тип данных - это плохо.
Например, возьмите 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
правильно, если оно было сочтено полезным сообществом?