Spec-Zone.ru › Haskell 9

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

ConstrainedClassMethods
Начиная с:

6.8.1

Статус:

Включено в 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.14.1/docs/users_guide/exts/constrained_class_methods.html

Spec-Zone.ru

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