Spec-Zone.ru › Haskell 9

6.8.3. Типы ограниченных методов класса

ConstrainedClassMethods
Since:

6.8.1

Status:

Включено в GHC2024, GHC2021

Подразумевается:

MultiParamTypeClasses

Позволяет определять дополнительные ограничения на отдельные методы класса.

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.

© 2002–2007 The University Court of the University of Glasgow. All rights reserved.
Licensed under the Glasgow Haskell Compiler License.
https://downloads.haskell.org/~ghc/9.12.1/docs/users_guide/exts/constrained_class_methods.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API