Ваш тип выглядит как Functor - давайте посмотрим, действительно ли это.
Поиск Hoogle для регулярного типа Functor подписи (в Haskell: (a -> b) -> f a -> f b
) возвращается, очевидно, Functor:
https://www.haskell.org/hoogle/?hoogle=%28a+-%3E+b%29+-%3E+f+a+-%3E+f+b
fmap :: Functor f => (a -> b) -> f a -> f b
Однако поиски (a -> a) -> f a -> f a
не найти ничего, связанные с:
https://www.haskell.org/hoogle/?hoogle=%28a+-%3E+a%29+-%3E+f+a+-%3E+f+a
Существуют различные типы функторов:
http://blog.tmorris.net/posts/functors-and-things-using-scala/index.html
https://en.wikipedia.org/wiki/Functor
, но ни один из названных них действительно соответствует вашей сигнатуру типа.
Давайте проверим, если ваш Functor удовлетворяет законам (ref1, ref2):
1)
если мы преобразуем функцию Ид над функтор, функтор, мы получаем обратно должны быть то же, что и исходный функтор .
Действительно, поскольку тип, возвращаемый с id
, аналогичен оригинальному типу.
2)
композиция двух функций, а затем отображение полученной функции над функтор должен быть таким же, как первый отображение одной функции над функтора, а затем отображения другого.
Также удовлетворены, хотя ограничивается типом функции вы можете применить на свой функтор, то есть только A => A
и не A => B
.
Чтобы сделать его Монада вам нужно, чтобы удовлетворить эти законы:
Left, Right Идентичность Идентичность ассоциативности.
https://wiki.haskell.org/Monad_laws
http://eed3si9n.com/learning-scalaz/Monad+laws.html
None, что я знаю. У вас есть пример такой структуры? Обратите внимание, что наличие только карты не создает структуру монады. Для этого вам нужна flatMap и немного больше. Если у вас есть только карта (общая), удовлетворяющая собственным законам, это всего лишь структура Functor. –
спасибо @DidierDupont. нет плоской карты, поэтому я думаю, что это просто функтор. Но я полагаю, что это все еще дегенерирующий функтор, согласно ответу Алексея ниже. –
Действительно, определенно не функтор. Функтору нужна общая функция отображения. –