Подтвердить что ты не робот

Примеры функторов без применения

Есть ли хорошие примеры Functor, которые не являются Applicative s? К счастью, я ищу нетривиальные (не Const Void) примеры, которые не нуждаются в обращениях к undefined. Если их нет, есть ли способ доказать, что пространство неинтересно?

Это похоже на Хорошие примеры не functor/functor/Applicative/Monad?, но он не был полностью разрешен там.

В качестве последующего вопроса есть ли интересные примеры Functor, которые могут быть оставлены без экземпляров Applicative из-за наличия значительного количества неканонических экземпляров Applicative? Например, "extended Maybe" немного скучно

data MayB a = Jus a | Nothing1 | Nothing2 | Nothing3 | ...

instance Applicative MayB where
  pure = Jus
  Jus f <*> Jus x = Jus (f x)
  Jus f <*> n     = n
  n     <*> Jus x = n
  n1    <*> n2    = methodOfResolvingNothingWhatsoever n1 n2

Существуют ли примеры, когда варианты экземпляра Applicative являются более существенными?

4b9b3361

Ответ 1

Основное место, где я вижу функтор, но не аппликаторы, - это большие типы продуктов. Рассмотрим что-то вроде

 data Mean where
    Unfair :: Monad a => a () -> Mean
 data Foo a = Bar Int Mean a

Это легко функтор, но нет способа сделать это аппликативным, потому что

 (Bar i g f) (Bar i' g' a) = Bar ??? ??? (f a)

Мы можем только заполнить наш ??? чем-то, что моноидоподобным, по крайней мере, одним способом и Mean никогда не будет, поскольку у нас нет способа указать что-либо, чтобы объединить два значения произвольных типов g :: a и g' :: b ассоциативным способом.

Кроме того, нам нужен mempty или что-то вроде этого для pure :: a -> f a. Нам дается a, поэтому большая часть типа данных, который включает a, тривиальна для построения, но для остальных требуется разумное "пустое" значение.

Итак, если бы мы разбили аппликативный и функтор в один класс большого типа, большая часть lens распалась бы, потому что большинство полезных случаев для объектива включали ситуации, подобные этим, где нет разумного экземпляра Applicative.

Итак, чтобы разбить это на ручную волнующе: когда существует много "вещей" в типе, который непосредственно не связан с аппликативным параметром типа, нам нужен способ объединить все этот "материал", который не всегда возможен.

Ответ 2

Очень важным (если нечестным) примером является

{-# LANGUAGE ExistentialQuantification #-}

data AFunctor a = forall f . Functor f => AFunctor { unFunct :: f a }