Control.Category
| Авторские права | (c) Ashley Yakeley 2007 |
|---|---|
| Лицензия | BSD-стиль (см. файл LICENSE в дистрибутиве) |
| Поддерживающий | ashley@semantic.org |
| Стабильность | стабильная |
| Переносимость | переносимая |
| Safe Haskell | Безопасный |
| Язык | 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 и . из прелюдии; вам, вероятно, потребуется либо импортировать этот модуль с квалификатором, либо скрыть функции прелюдии:
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.12.1/docs/libraries/base-4.21.0.0-8e62/Control-Category.html