Я пытаюсь определить класс типа для бикатегорий и создать его экземпляр с бикатегорией категорий, функторов и естественных преобразований.
{-# LANGUAGE NoImplicitPrelude, MultiParamTypeClasses,
TypeOperators, KindSignatures, Rank2Types,
ScopedTypeVariables, FlexibleInstances, InstanceSigs #-}
Вот класс для категорий:
class Category (c :: * -> * -> *) where
id :: c x x
(.) ::c y z -> c x y -> c x z
Вот класс для функторов:
class Functor c d f where
fmap :: c x y -> d (f x) (f y)
Вот состав функторов:
newtype Comp g f t = Comp (g (f t))
Композиция двух функторов должна быть функтором. Однако следующий экземпляр не принимается Haskell, потому что f
и g
не входят в область видимости. Как бы вы определили здесь fmap
?
instance Functor c e (Comp g f) where
fmap :: c x y -> e (Comp g f x) (Comp g f y)
fmap = fmap g . fmap f
Вот естественные преобразования (параметр c здесь не используется, но полезен для следующего экземпляра ниже.):
newtype NT f g (c :: * -> * -> *) d =
NT {unNT :: forall x. d (f x) (g x) }
Вот класс для бикатегорий (операторы .|
и .-
- это соответственно вертикальная и горизонтальная композиции для 2-ячеек):
class Bicategory
(bicat :: (* -> *) -> (* -> *) -> (* -> * -> *) -> (* -> * -> *) -> *)
comp where
id1 :: Category d => bicat f f c d
(.|) :: Category d => bicat g h c d -> bicat f g c d -> bicat f h c d
(.-) :: bicat g g' d e -> bicat f f' c d -> bicat (g `comp` f) (g' `comp` f') c e
Категории, функторы и естественные преобразования должны образовывать бикатегории. Однако следующий экземпляр не принимается Haskell, потому что в определении горизонтальной композиции .-
естественных преобразований g не входит в область видимости. Как бы вы определили здесь горизонтальную композицию (.-)
?
instance Bicategory NT Comp where
id1 = NT id
n .| m = NT (unNT n . unNT m)
(n :: NT g g' d e) .- m = NT (unNT n . fmap g (unNT m))
f
иg
- это переменные уровня типа, а не переменные уровня значения. - person David Young   schedule 09.08.2014Category
дляc
иe
(и вы также не задали имCategory
ограничение), поэтому это невозможно. Как написано,fmap
должен работать для всех возможных вариантовc
иe
. Есть неявныйforall
. Например, что он будет делать, еслиc
равноConst
, аe
равноTagged
? - person David Young   schedule 09.08.2014