-
ConstrainedClassMethods -
- Since:
-
6.8.1
- Status:
- Подразумевается:
Позволяет определять дополнительные ограничения на отдельные методы класса.
Haskell 98 запрещает типы методов класса упоминать ограничения на переменную типа класса, следовательно:
class Seq s a where fromList :: [a] -> s a elem :: Eq a => a -> s a -> Bool
Тип elem является недопустимым в Haskell 98, поскольку он содержит ограничение Eq a, которое ограничивает только переменную типа класса (в данном случае a). Более точно, ограничение в сигнатуре метода класса отклоняется, если
-
Ограничение упоминает по крайней мере одну переменную типа. Таким образом, это разрешено:
class C a where op1 :: HasCallStack => a -> a op2 :: (?x::Int) => Int -> a
-
Все упоминаемые переменные типа связаны объявлением класса, и ни одна не является локально квантифицированной. Примеры:
class C a where op3 :: Eq a => a -> a -- Rejected: constrains class variable only op4 :: D b => a -> b -- Accepted: constrains a locally-quantified variable `b` op5 :: D (a,b) => a -> b -- Accepted: constrains a locally-quantified variable `b`
GHC снимает это ограничение с помощью расширения языка ConstrainedClassMethods. Это ограничение изначально довольно глупо, поэтому ConstrainedClassMethods подразумевается MultiParamTypeClasses.