2015-10-28 2 views
1

В Scala монад, таких как List, мы имеем map метод, который преобразует List[A] в List[B], как так:Есть ли название этого вырожденного вида монады?

trait List[A] { 
    def map[B](f: (A) => B): List[B] 
} 

У меня есть что-то подобное, за исключением того, метод map принимает только функции от A до A, как это:

trait State[A] { 
    def map(f: (A) => A): State[A] 
} 

есть ли имя монады с методом вырожденного map, как это? На самом деле это не монада, не так ли?

+2

None, что я знаю. У вас есть пример такой структуры? Обратите внимание, что наличие только карты не создает структуру монады. Для этого вам нужна flatMap и немного больше. Если у вас есть только карта (общая), удовлетворяющая собственным законам, это всего лишь структура Functor. –

+0

спасибо @DidierDupont. нет плоской карты, поэтому я думаю, что это просто функтор. Но я полагаю, что это все еще дегенерирующий функтор, согласно ответу Алексея ниже. –

+0

Действительно, определенно не функтор. Функтору нужна общая функция отображения. –

ответ

1

Ваш тип выглядит как 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

+0

Спасибо @aleksey. здесь есть много хороших ссылок для функторов. –

Смежные вопросы