Прочитав этот Wikibook об основах Haskell и теории категорий, я узнал о функторах:
Функтор - это, по сути, преобразование между категориями, поэтому для категорий C и D функтор F: C -> D
отображает любой объект A из C в F (A) из D.
отображает морфизмы f: A -> B в C в F (f): F (A) -> F (B) в D.
... звучит неплохо. Позже будет представлен пример:
У нас тоже есть образец:
instance Functor Maybe where
fmap f (Just x) = Just (f x)
fmap _ Nothing = Nothing
Вот ключевая часть: конструктор типа Maybe принимает любой тип T в новый тип, Maybe T. Кроме того, fmap, ограниченный типами Maybe, принимает функцию a -> b в функцию Maybe a -> Maybe b. Но это все! Мы определили две части: что-то, что переводит объекты в Hask в объекты другой категории (типы Maybe и функции, определенные для типов Maybe), и что-то, что переводит морфизмы в Hask в морфизмы в этой категории. Итак, может быть, это функтор.
Я понимаю, что определение fmap
является ключевым. Я не понимаю, как «конструктор типа Maybe» предоставляет первую часть. Я бы скорее ожидал чего-то вроде pure
.
Если я правильно понял, Maybe
скорее отображает C
в D
. (Таким образом, являясь морфизмом на уровне категории, который может быть требованием для функтора)
Думаю, вы могли бы перефразировать мой вопрос так: есть ли функтор, в котором нет очевидной реализации pure
?
Functor
, который не допускаетpure
, - этоdata Void a
. Экземпляр выглядит какinstance Functor Void where { fmap f x = case x of {} }
. (Я не даю этого ответа, потому что не думаю, что этот пример особенно поучительный, хотя он отвечает на единственный вопрос, который вы действительно задаете телу.) - person Daniel Wagner   schedule 30.10.2015Functor
, который не допускаетpure
: если у вас есть любое значениеv
вFunctor
, вы можете определитьpure x = x <$ v
. И я думаю, что каждый выбор дляpure
тоже имеет такую форму. Конечно, это обычно не является чем-то особенным. - person Ørjan Johansen   schedule 31.10.2015pure
. Вот пара примеров:instance Functor ((,) a)
имеетfmap f (a, b) = (a, f b)
, но как бы вы реализовалиpure
?pure x = (error "shit", x)
. Если вам удалось реализоватьpure
, вы могли бы получитьmagic = fst . pure ()
magic :: a
, что является своего рода доказательством того, что такойpure
по своей сути будет включать_|_
. (Я понимаю, чтоMonoid a => (,) a
допускаетpure
, но(,) a
нет. Другой пример -instance Functor (Map k)
, а еще один -instance Functor (Const m)
. - person semicolon   schedule 28.09.2016a
: Я не делаю никаких заявлений о конструкторах полиморфных типов. Еслиa
имеет значение без оснований, то очевидно, что у васpure
тоже без оснований. А еслиa
не имеет значения, то он изоморфенVoid
. Но теперь я вижу, что лень усложняет дело, поскольку(error "shit", x)
не является самой нижней частью Haskell. Я думаю, что для такого рода вопросов типично игнорировать все основания (иначе вы могли бы просто сказатьpure x = undefined
и покончить с этим), и тогда я думаю, что мое утверждение все еще верно для любого мономорфного примера. - person Ørjan Johansen   schedule 30.09.2016pure
не входит вFunctor
, чего НЕ ДОЛЖНО быть. И даже мономорфные примеры не обязательно имеют наилучшее значение по умолчанию. Например, спискиpure 5 :: ZipList Int
иpure 5 :: [Int]
очень сильно различаются, но оба имеют решающее значение для соответствующихApplicative
экземпляров. - person semicolon   schedule 30.09.2016Maybe
как о их собственной категории (конечно, подкатегории Hask)? Если это так, то цитата совершенно правильная. Я всегда так смотрел на функторы Haskell, а не как на эндофункторы. Конечно, их можно рассматривать как эндофункторы, но поскольку конструктор типов всегда создает новые типы, большинство эндофункторов в Hask не могут быть выражены как функторы Haskell. - person Ben   schedule 04.12.2016