User: Привет, я бы хотел услышать шутку про Haskell.
Haskell: Ок. Почему курица переходит дорогу?
User: Не знаю. Почему?
Haskell: Это на самом деле очень просто. Лучший способ понять это исходит из идеи контравариантного функтора. Как вы возможно знаете, функтор это всего лишь отображение из одной категории в другую с сохранением структуры категории; гомоморфизм между категориями, если хотите. Теперь, некоторые конструкции, которые мы хотим выразить, выглядят как функторы но в некотором смысле "поворачивают морфизмы наоборот". Мы называем это контравариантыми функторами. Как вы возможно заметили, мы безусловно можем определить контравариантный функтор как просто ковариантный функтор из двойственной категории, если ссылаться на очевидное соответствие. Конечно, вы уже заметили очевидную связь, которую это имеет с обобщением топологических предпучков теории категорий — предпучок на категории это всего лишь контравариантный функтор из частично упорядоченного множества открытых множеств в категорию множеств. Теперь, становится очевидно, что...
User:	Hello, I would like to hear a Haskell joke.
Haskell: Okay. Why did the chicken cross the road?
User:	I don't know, why?
Haskell: It's very simple really. The best way to understand it comes from
the idea of a contravariant functor. As you probably know, a functor is just a mapping between