Что такое проектор kind

#scala #functional-programming #lambda-calculus #higher-kinded-types #kind-projector

#scala #функциональное программирование #лямбда-исчисление #higher-kinded-types #kind-проектор

Вопрос:

Я копался в FP и во всем, что его окружает, и я нашел где-то написанную концепцию kind projector, без подробностей и объяснений.

Единственное, что я нашел, это проект github, и я начинаю думать, имел ли он в виду этот конкретный проект или какую-то общую концепцию в FP?

Итак, что такое проектор kind? Почему это полезно? (если возможно, можете ли вы предоставить примеры, ресурсы и т. Д.?)

Комментарии:

1. Именно так они назвали свой плагин. Это не концепция FP.

2. Есть виды и есть проекции . Я не думаю, что это означает что-то конкретное.

Ответ №1:

Это действительно просто немного неудобное название для конкретного плагина для компилятора Scala, с которым вы связались. Я не думаю, что это имеет какое-либо значение для себя, но это как бы соответствует его цели.

Что делает плагин, так это предоставляет альтернативный синтаксис обычному обходному пути Scala для лямбд типа, который использует языковую функцию, называемую проекциями типов.

Допустим, вы хотели реализовать Functor для Either . Теперь Functor требуется kind * -> * , тогда Either как имеет kind * -> * -> * . Итак, нам нужно сначала исправить первый аргумент, а затем предоставить реализацию для частично применяемого конструктора типов. Единственный способ сделать это в «обычной» Scala — это:

 implicit def eitherIsFunctor[A]: Functor[{type λ[X] = Either[A, X]}#λ] = { ... }
  

где {type λ[X] = Either[A, X]} анонимный структурный тип, который сразу используется только для «проецирования» λ , тип, который нам действительно нужен. В Haskell вы могли бы просто сказать

 instance Functor (Either a) where ...
  

где Either применяется частично (и a определяется количественно автоматически).

Плагин позволяет заменить проекцию чем-то, что больше похоже на обычное частичное приложение в Scala, а именно Either[A, ?] , вместо {type λ[X] = Either[A, X]}#λ труднопонятного (а также предоставляет лямбды общего типа, я думаю, всегда путем преобразования их в анонимные типы и проекции).

Комментарии:

1. Вот хорошо сделанное вступление по этой теме.

2. в текущей версии на Dotty вы можете написать Functor[[X] =>> Either[A, X]] вместо Functor[{type λ[X] = Either[A, X]}#λ]

Ответ №2:

Scala 3 предоставляет лямбды собственного типа, которые больше не основаны на проекции типа

Тип lambda, такой как [X] =>> F[X] определяет функцию от типов к типам.

Например,

 trait Functor[F[_]]

new Functor[Either[String, Int]] {}                   // error
new Functor[({ type λ[X] = Either[String, X] })#λ] {} // Scala 2 type lambda based on type projection
new Functor[λ[X => Either[String, X]]] {}             // kind projector type lambda
new Functor[Either[String, *]] {}                     // kind projector type lambda
new Functor[[X] =>> Either[String, X]] {}             // Scala 3 type lambda         
  

Кроме того, существует предложение SIP: Синтаксис подчеркивания для лямбд типа # 5379, такой, что

 Functor[Either[String, _]] // equivalent to Functor[[X] =>> Either[String, X]]