Scala 3 имеет мощный механизм выражения конструкторов типов через лямбда-выражения типов.
Даже лямбда-выражения простого типа могут выполнять мощные функции, такие как выражение частичного применения конструктора типа (см., например, https://stackoverflow.com/a/75428709/336184).
Документы упоминают «параметры каррированного типа», например
type TL = [X] =>> [Y] =>> (X, Y)
это выглядит еще более абстрактно.
Вопрос:
Кто-нибудь может привести рабочий пример с реализацией лямбды такого типа? Кроме того, какова практическая цель такой абстракции? Есть параллели с Haskell?
type TL = [X] =>> [Y] =>> ...
такой же как
type TL[X] = [Y] =>> ...
и должно быть таким же, как
type TL[X][Y] = ...
если было несколько списков типов-параметров (ОСТП).
Так что [X] =>> [Y] =>> ...
должен быть способом представить такой тип анонимно.
MTPL вместе с параметрами именованного типа может быть полезен для указания некоторых параметров типа и вывода остальных.
Невозможно доказать эквивалентность с типом, зависящим от пути
Каррированный тип "не принимает параметры типа"
https://contributors.scala-lang.org/t/multiple-type-parameter-lists-in-dotty-si-4719/2399
https://github.com/scala/bug/issues/4719
https://docs.scala-lang.org/scala3/reference/experimental/named-typeargs.html
Например, указание некоторых параметров типа и вывод остальных может быть необходимо для вычислений на уровне типа. В настоящее время для вычислений на уровне типов люди либо делают параметры типа вложенными, либо используют члены типа вместо параметров типа.
Когда нужны зависимые типы в Shapeless?
В Haskell вы можете написать
foo :: forall (f :: * -> * -> *) . ()
foo = ()
но в Scala без реализации MTPL в настоящее время вы не можете писать
def foo[F[_][_]]: Unit = ()
ты можешь только написать
def foo[F[_,_]]: Unit = ()
Если бы было ОСАГО, то для определения типа def foo[F[_][_]]...
было бы удобно иметь каррированные лямбды типа [X] =>> [Y] =>> ...
, можно было бы использовать их на сайте звонка foo[[X] =>> [Y] =>> ...]
.
В Haskell все конструкторы типов каррируются и нет лямбда-выражений типов.
Лямбда для типовых выражений в Haskell?
@Max Ну, может быть TL[K][V] = Map[K, V]
(мы хотели бы указать K
и сделать вывод V
) или TL[K, +V][P] = CircularMap[K, V, P]
в stackoverflow.com/questions/69120836/… или TL[In][O] = MyTypeclass[In] { type Out = O }
для любого класса типов в вычислениях на уровне типов, например stackoverflow .com/questions/75418623/… Я думаю, [X] =>> [Y] =>> ...
в настоящее время немного преждевременны и не так полезны без type TL[X][Y]
, def foo[X][Y]
, def foo[F[_][_]]
@Max, и написано, что «никаких специальных условий для вывода аргументов типа для таких каррированных лямбда-выражений не предусмотрено» в docs.scala-lang.org/scala3/reference/new-types/…
Дмитрий, ты продолжаешь качаться 🤘🎸! Часть «и должно быть таким же, как... если бы было несколько списков параметров типов (MTPL)» очень и очень интересна. Возможно ли, чтобы вы написали какую-либо фактическую реализацию псевдонима типа
type TL = ...
для иллюстрации, чтобы сделать его более осязаемым и не таким абстрактным?