Символы сами ничего не значат. Это произвольные имена Хайко выбрали:
> class Foo[A, B]
defined class Foo
> class Foo[M1[_], M2[_]]
defined class Foo
> class GenericFunctor[->>[_, _], ->>>[_, _], F[_]]
defined class GenericFunctor
Они являются частью параметров типа, что они сами являются конструкторами типов (выше-kinded типов, если вы хотите, чтобы звук фантазии). Тип приложения можно написать инфикс, поэтому A ->> B
такой же, как ->>[A, B]
.
В соответствии с того, что происходит ... Хайко говорит
Глядя на ингредиенты, мы находим все, что нам нужно: Типы A
и B
привязываются к типам F[A]
и F[B]
и карты A ->> B
отображаются на картах F[A] ->>> F[B]
.
Поскольку мы говорим о теории категорий, мы хотим избежать функции термина, потому что это конкретная реализация, но мы хотим описать что-то вроде функции. Что-то вроде функции в их жаргоне - стрела. Нам нужны два из них, так как мы не хотим, чтобы входящие и исходящие стрелки были одинаковыми. Эти две стрелки представлены ->>
и ->>>
. F[_]
- контейнер, подобный List
и Option
. Я думаю ..
Таким образом, fmap
(ака метод в Scala) принимает стрелку значений и возвращает другую стрелку контейнеров. Кроме того, в отличие от метода map
, fmap
возвращает стрелу, которая принимает контейнер.
Специфическое применение GenericFunctor
с использованием Function
для обеих стрелок - Functor
. И конкретное применение Functor
, которое использует List
для контейнера, - ListFunctor
.
object ListFunctor extends Functor[List] {
def fmap[A, B](f: A => B): List[A] => List[B] = as => as map f
}
Так что берет функцию от A
к B
, и возвращает функцию из List[A]
в List[B]
, вызывая map
внутри.
Привет, Евгений, отличный ответ! – jxstanford
Что означает список [B] = как ** => как карта **? Никогда не видел этот синтаксис – Jay