2012-01-29 3 views
8

Хайко Seeberger написал большое сообщение в блоге категории теории здесь:В параметрах типа Scala, что делать - >> и - >>> означает?

https://hseeberger.wordpress.com/2010/11/25/introduction-to-category-theory-in-scala/

В ней он определяет GenericFunctor так:

trait GenericFunctor[->>[_, _], ->>>[_, _], F[_]] { 
    def fmap[A, B](f: A ->> B): F[A] ->>> F[B] 
} 

У меня не было никакой удачи найти ссылки документации на символы - >> и - >>> в документации. Может кто-нибудь объяснить, что они делают?

ответ

14

Символы сами ничего не значат. Это произвольные имена Хайко выбрали:

> 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 внутри.

+0

Привет, Евгений, отличный ответ! – jxstanford

+0

Что означает список [B] = как ** => как карта **? Никогда не видел этот синтаксис – Jay

5

Ключ в том, что они находятся в квадратных скобках в определении признаков: это просто произвольные символы, которые были выбраны автором блога, так же как [T] часто выбирается для общих классов, черт и методов. Они здесь, скорее всего, являются более высокоподобными типами (то есть параметрами с параметрами).

Стрелка, как название было выбрано, потому что, как он говорит,

«A - >> B это просто еще один способ записи - >> [A, B], который хорошо отражает тот факт, что мы говорим о картах здесь ».

+0

Привет Луиджи, также отличный ответ, но я даю чек Юджину для более глубокого объяснения ... – jxstanford

1

Ответ скопирован с my answer to a duplicate question on request:

Это higher-kinded type, описано хорошо в this introduction и в этом research paper.

Причина, по которой вам кажется, что это путаница, заключается в том, что ->> - это имя более высокого типа - вместо этого оно могло бы быть названо также Arrow.

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