Это потому, что String
- это просто псевдоним типа для [Char]
, который является просто применением конструктора типа []
к типу Char
, поэтому он будет иметь вид ([] Char)
.которая не имеет формы (T a1 .. an)
, поскольку Char
не является переменной типа.
Причина этого ограничения состоит в том, чтобы предотвратить наложение экземпляров.Например, предположим, у вас был instance Fooable [Char]
, а затем кто-то позже пришел и определил instance Fooable [a]
.Теперь компилятор не сможет определить, какой из них вы хотите использовать, и выдаст вам ошибку.
Используя -XFlexibleInstances
, вы в основном обещаете компилятору, что не будетеопределите любые такие экземпляры.
В зависимости от того, что вы пытаетесь выполнить, может быть лучше определить оболочку:
newtype Wrapper = Wrapper String
instance Fooable Wrapper where
...