Какие типы различаются между категориями?

Я все еще знаком со всеми вещами теории этой категории, и почти каждый пример, который я вижу, связан с Maybe или Array. Но я не нашел примеров различий между этими категориями. Например, вот некоторые из вопросов, на которые я все еще не мог ответить:

  • Что такое полугруппа, которая не является также моноидом?
  • Что такое Складная, которая также не является Traversable? [Дублировать]
  • Что такое Functor, который не является также Apply?
  • Что такое Apply, которое также не является аппликативным?
  • Что такое приложение, которое также не является цепочкой?
  • Какова Цепочка, которая не является также Монадой?
  • Какая аппликация, которая также не является монадой? [Дублировать]

Я изучаю этот материал в контексте JavaScript FantasyLand, так что, откуда я получаю сообщение, я понимаю это разные слова для этих вещей.

Ответ 1

1. Что такое полугруппа, которая также не является моноидом?

Кактус дает отличный пример полугруппы, которая не является моноидом. Непустые (конечные) списки любого типа представляют собой свободную полугруппу над этим типом. Другим примером является Data.Void.Void, который не является Monoid, потому что он не имеет каких-либо элементов и, следовательно, не имеет элемента идентификации. Еще одним примером является множество положительных целых чисел при добавлении.

3. Что такое Functor, который также не применяется?

Один Functor, а не Apply равен Handler.

data Handler a where
  Handler :: Exception e => (e -> IO a) -> Handler a

instance Functor Handler where
  fmap f (Handler h) = Handler (\e -> f <$> h e)

Учитывая Handler f :: Handler (a -> b) и Handler g :: Handler a, вы имеете

f :: e1 -> IO (a -> b)
g :: e2 -> IO a

Где e1 и e2 - (возможно, разные) типы исключений. Вам нужно создать h :: e3 -> IO b для некоторого типа исключения e3. Не существует действительно разумного способа сделать это **.

Кажется труднее найти Functor, который нельзя сделать в законопослушные экземпляры Apply, потому что Apply имеет только один закон и поэтому допускает всевозможные странные вещи, которые отклонил Applicative.

4. Что такое приложение, которое также не является аппликативным?

6. Какой аппликатор, который также не является монадой?

Map k и IntMap. Кроме того, (,) a и Const a, когда a является Semigroup, но не a Monoid. Аналогично, некоторые другие типы соответствуют шаблону принятия более слабого контекста для Apply и/или Bind, чем для Applicative или Monad соответственно.

5. Что такое приложение, которое также не является цепочкой?

ZipList является Apply, но не a Bind. Я не знаю, что такое Chain.


** Один получувственный способ может выглядеть так:

data P x y = P x y deriving (Show, Typeable)
instance (Exception x, Exception y) =>
            Exception (P x y)
instance Apply Handler where
  Handler f <.> Handler g =
    Handler (\(P e1 e2) -> f e1 <*> g e2)

Я думаю, что это подчиняется закону Apply, но я еще не совсем уверен.

Ответ 2

Непустые списки, определенные как data NEList a = Cons a [a], являются полугруппами, но не моноидами.