-
ConstrainedClassMethods -
- Начиная с:
-
6.8.1
- Статус:
- Подразумевается расширением:
Позволяет задавать дополнительные ограничения для отдельных методов классов.
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.