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 Источник
Тождественный морфизм. Реализации должны удовлетворять двум законам:
По сути, эти законы утверждают, что id не должен «ничего делать».
(.) :: forall (b :: k) (c :: k) (a :: k). cat b c -> cat a b -> cat a c infixr 9 Источник
Композиция морфизмов. Реализации должны удовлетворять закону:
Это означает, что способ группировки морфизмов не имеет значения, поэтому композицию морфизмов можно однозначно записывать как f . g . h без скобок.
Экземпляры
| Category Op Источник | |
| Monad m => Category (Kleisli m :: Type -> Type -> Type) Источник | Начиная с: base-3.0 |
| Category (Coercion :: k -> k -> Type) Источник | Начиная с: base-4.7.0.0 |
| Category ((:~:) :: k -> k -> Type) Источник | Начиная с: base-4.7.0.0 |
| Category (->) Источник | Начиная с: base-3.0 |
Определён в GHC.Internal.Control.Category | |
| Category ((:~~:) :: k -> k -> Type) Источник | Начиная с: base-4.10.0.0 |
Комбинаторы
(<<<) :: 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