Spec-Zone.ru › Haskell 9

Control.Category

Авторские права (c) Ashley Yakeley 2007
Лицензия В стиле BSD (см. файл LICENSE в дистрибутиве)
Сопровождающий ashley@semantic.org
Стабильность стабильный
Переносимость переносимый
Безопасный Haskell Safe
Язык Haskell2010

Содержание

  • Класс
  • Комбинаторы

Описание

Класс

class Category (cat :: k -> k -> Type) where Источник

Класс категорий.

В математике категория определяется как совокупность объектов и совокупность морфизмов между объектами, а также тождественный морфизм id для каждого объекта и операция (.), которая компонует совместимые морфизмы.

Этот класс определён аналогичным образом. Совокупность морфизмов представлена параметром типа cat, имеющим вид k -> k -> Type для некоторой переменной вида k, которая представляет совокупность объектов; чаще всего в качестве k выбирается Type.

Примеры
Развернуть

Как подсказывают имена методов, существует категория функций:

instance Category (->) where
  id = \x -> x
  f . g = \x -> f (g x)

Изоморфизмы также образуют категорию:

data Iso a b = Iso (a -> b) (b -> a)

instance Category Iso where
  id = Iso id id
  Iso f1 g1 . Iso f2 g2 = Iso (f1 . f2) (g2 . g1)

Ещё один важный пример — естественные преобразования:

newtype f ~> g = NatTransform (forall x. f x -> g x)

instance Category (~>) where
  id = NatTransform id
  NatTransform f . NatTransform g = NatTransform (f . g)

Используя языковое расширение TypeData, можно также создать категорию, в которой k — это не Type, а пользовательский вид Door:

type data Door = DoorOpen | DoorClosed

data Action (before :: Door) (after :: Door) where
  DoNothing :: Action door door
  OpenDoor :: Action start DoorClosed -> Action start DoorOpen
  CloseDoor :: Action start DoorOpen -> Action start DoorClosed

instance Category Action where
  id = DoNothing

  DoNothing . action = action
  OpenDoor rest . action = OpenDoor (rest . action)
  CloseDoor rest . action = CloseDoor (rest . action)

Методы

id :: forall (a :: k). cat a a Источник

Тождественный морфизм. Реализации должны удовлетворять двум законам:

Правое тождество
f . id = f
Левое тождество
id . f = f

По сути, эти законы утверждают, что id не должен «ничего делать».

(.) :: forall (b :: k) (c :: k) (a :: k). cat b c -> cat a b -> cat a c infixr 9 Источник

Композиция морфизмов. Реализации должны удовлетворять закону:

Ассоциативность
f . (g . h) = (f . g) . h

Это означает, что способ группировки морфизмов не имеет значения, поэтому композицию морфизмов можно однозначно записывать как f . g . h без скобок.

Экземпляры
Подробности экземпляров
Category Op Источник
Подробности экземпляра

Определён в Data.Functor.Contravariant

Методы

id :: Op a a Источник

(.) :: Op b c -> Op a b -> Op a c Источник

Monad m => Category (Kleisli m :: Type -> Type -> Type) Источник

Начиная с: base-3.0

Подробности экземпляра

Определён в GHC.Internal.Control.Arrow

Методы

id :: Kleisli m a a Источник

(.) :: Kleisli m b c -> Kleisli m a b -> Kleisli m a c Источник

Category (Coercion :: k -> k -> Type) Источник

Начиная с: base-4.7.0.0

Подробности экземпляра

Определён в GHC.Internal.Control.Category

Методы

id :: forall (a :: k). Coercion a a Источник

(.) :: forall (b :: k) (c :: k) (a :: k). Coercion b c -> Coercion a b -> Coercion a c Источник

Category ((:~:) :: k -> k -> Type) Источник

Начиная с: base-4.7.0.0

Подробности экземпляра

Определён в GHC.Internal.Control.Category

Методы

id :: forall (a :: k). a :~: a Источник

(.) :: forall (b :: k) (c :: k) (a :: k). (b :~: c) -> (a :~: b) -> a :~: c Источник

Category (->) Источник

Начиная с: base-3.0

Подробности экземпляра

Определён в GHC.Internal.Control.Category

Методы

id :: a -> a Источник

(.) :: (b -> c) -> (a -> b) -> a -> c Источник

Category ((:~~:) :: k -> k -> Type) Источник

Начиная с: base-4.10.0.0

Подробности экземпляра

Определён в GHC.Internal.Control.Category

Методы

id :: forall (a :: k). a :~~: a Источник

(.) :: forall (b :: k) (c :: k) (a :: k). (b :~~: c) -> (a :~~: b) -> a :~~: c Источник

Комбинаторы

(<<<) :: forall {k} cat (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c infixr 1 Источник

Композиция справа налево. Это синоним (.), но он может быть полезен, чтобы нагляднее показать порядок композиции.

(>>>) :: forall {k} cat (a :: k) (b :: k) (c :: k). Category cat => cat a b -> cat b c -> cat a c infixr 1 Источник

Композиция слева направо. Она удобна, если вы хотите записать морфизм в виде конвейера, направленного слева направо.

Примечание о конфликтах имён

Методы из Category конфликтуют с id и . из Prelude; вероятно, вам понадобится либо импортировать этот модуль с квалификатором, либо скрыть функции Prelude:

import Prelude hiding (id, (.))

© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/9.14.1/docs/libraries/base-4.22.0.0-66f8/Control-Category.html

Spec-Zone.ru

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