Ответ 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
, но я еще не совсем уверен.