Monads получает fmap
от Functor
typeclass. Почему comonads не нужен метод cofmap
, определенный в классе Cofunctor
?Почему в Haskell нет класса «Кофейник»?
ответ
Functor
определяется как:
class Functor f where
fmap :: (a -> b) -> (f a -> f b)
Cofunctor
может быть определена следующим образом:
class Cofunctor f where
cofmap :: (b -> a) -> (f b -> f a)
Таким образом, оба технически же, и именно поэтому Cofunctor
не существует. «Двойное понятие« функтора вообще »по-прежнему является« функтором вообще »».
С Functor
и Cofunctor
такие же, как монады, так и комонады определяются с помощью Functor
. Но не позволяйте этому заставлять вас думать, что монады и комонады - это одно и то же, а это не так.
Монадой определяется (упрощение), как:
class Functor m => Monad where
return :: a -> m a
(>>=) :: m a -> (a -> m b) -> m b
является ли комонадой (опять же, упрощенный):
class Functor w => Comonad where
extract :: w a -> a
extend :: (w a -> b) -> w a -> w b
Обратите внимание на "симметрии".
Другое дело контравариантный функтор, определяемый как:
import Data.Functor.Contravariant
class Contravariant f where
contramap :: (b -> a) -> (f a -> f b)
Не было бы двойственным функтором C -> D функтором D -> C? Таким образом, двойственный функтор ** ** является не тем же самым функтором, но двойственное понятие «функтора вообще» по-прежнему является «функтором вообще». Я думаю, что я просто играю семантику, но язык в «функторе - это сам двойной» звучит как утверждение о том, что индивидуальный функтор каким-то образом можно использовать как свой собственный обратный или что-то еще. – Ben
@Ben Вы правы. Я исправил это. –
@Ben Это более или менее соответствует формальному определению: https://en.wikipedia.org/wiki/Equivalence_of_categories#Definition – Zaaier
Для справки,
class Functor w => Comonad w where
extract :: w a -> a
duplicate :: w a -> w (w a)
extend :: (w a -> b) -> w a -> w b
instance Applicative m => Monad m where
return :: a -> m a
(>>=) :: m a -> (a -> m b) -> m b
join :: Monad m => m (m a) -> m a
Обратите внимание, что данный extract
и extend
вы можете производить fmap
и duplicate
, и что, учитывая return
и >>=
вы можете произвести fmap
, pure
, <*>
и join
. Поэтому мы можем сосредоточиться только на pure
+ >>=
и extract
+ extend
.
Я полагаю, вы могли бы искать что-то вроде
class InverseFunctor f where
unmap :: (f a -> f b) -> a -> b
Поскольку Monad
класс позволяет легко «навести» в то время как только позволяет некий гипотетический подход к «принимая вещи», и Comonad
что-то противное, ваш запрос изначально звучит разумно. Тем не менее, существует значительная асимметрия между >>=
и extend
, которая будет мешать любой попытке определить unmap
. Обратите внимание, в частности, что первый аргумент >>=
имеет тип m a
. Второй аргумент extend
имеет тип w a
— неa
.
мы могли бы определить unmap с помощью: «unmap f = extract. F. Return» и подписи типа "unmap :: Monad f, Comonad f => (fa -> fb) -> a -> b" – Stratege
Собственно, вы ошибаетесь: есть один!
- 1. Почему этот кофейник не работает?
- 2. Почему нет частичного применения Haskell?
- 3. Почему в Haskell нет неявного параллелизма?
- 4. Почему нет класса NSHTTPURLProtocol?
- 5. Почему в базовых библиотеках Haskell нет типа «непустого списка»?
- 6. Haskell: Почему нет несоответствия типа (и почему это компилируется)?
- 7. Почему у haskell нет гетерогенных списков
- 8. - это кофейник быстрее, чем javascript?
- 9. Почему нет java.lang.Throwable абстрактного класса?
- 10. Haskell: | в заявлении класса
- 11. Почему в Swift нет гибридного класса-протокола?
- 12. Почему в этом классе нет класса «я»?
- 13. Почему нет статического класса в Java
- 14. Почему в стандартной библиотеке Haskell нет функции scanl?
- 15. Почему нет «общих» функций доступа для кортежей в Haskell?
- 16. Почему нет способа получить аппликативные функторы в Haskell?
- 17. Почему нет функции head для Seq в Haskell
- 18. «Нет операции» haskell
- 19. Haskell: Почему (+), (-) часть Num typeclass?
- 20. Экстремальный экземпляр класса в Haskell
- 21. Отдел в Haskell, Тип класса
- 22. Создание класса Coordinate в Haskell
- 23. Почему нет дочернего класса, ограниченного свойствами родителя?
- 24. Почему у класса Duration нет метода toSeconds()?
- 25. Случай экземпляра класса Haskell
- 26. Почему нет метода из шаблонного базового класса?
- 27. Недостаток класса типа Haskell
- 28. Почему у экземпляра класса нет открытого конструктора?
- 29. Недоразумение класса Haskell
- 30. Haskell - Happy - «Нет экземпляра ...» error
Это потому, что кофунктор такое же, как функтор. Между ними нет никакой разницы. Однако монады и комонады разные. Существует такая вещь, как контравариантный функтор, но с методом «contramap», который имеет тип «контравариант f => (a -> b) -> f b -> f a'. Однако это не то же самое, что кофейник. –
Вы имеете в виду «cofunctor» как двойственный функтор (который является просто функтором, поскольку он является самодвойственным) или означает контракторный функтор? http://math.stackexchange.com/questions/394472/is-cofunctor-an-accepted-term-for-contravariant-functors –